Pisze program, ktory ma laczyc sie z baza MySQL, pobierac rekordy z bazy danych i wyswietlac je w tabeli. Nazwy tabel i informacje potzrebne do implementacji modelu tabeli maja byc pobierane z metadanych.
Oto klasa implementujaca AbstactTableModel:
class ModelTabeli extends AbstractTableModel {
public ModelTabeli(ResultSet rSet)
{
rs=rSet;
try
{
rsmd=(ResultSetMetaData) rs.getMetaData();
}catch(SQLException e){
e.printStackTrace();
}
}
public String getColumnname(int c)
{
try{
return rsmd.getColumnName(c +1);
}catch(SQLException e){
e.printStackTrace();
return "";
}
}
public int getColumnCount()
{
try{
return rsmd.getColumnCount();
}catch(SQLException e){
e.printStackTrace();
return 0;
}
}
public Object getValueAt(int r,int c)
{
try{
rs.absolute(r +1 );
return rs.getObject(c +1);
}catch(SQLException e){
e.printStackTrace();
return null;
}
}
public int getRowCount()
{
try{
rs.last();
return rs.getRow();
}catch(SQLException e){
e.printStackTrace();
return 0;
}
}
private ResultSet rs;
private ResultSetMetaData rsmd;
}
A to funkcja, ktora obsluguje zdarzenie wyboru tablicy z rozwijanej listy. Nastepuje w niej przeakzanie obiektu ResultSet do obiektu modelu tabeli i ustawienie modelu.
private void wyborTabActionPerformed(java.awt.event.ActionEvent evt) {
model=new ModelTabeli(rs);
jTable1.setModel(model);
try{
nazwaTab = (String)wyborTab.getSelectedItem();
zapt="SELECT * FROM ";
Connection con=nowePolaczenie.zwrocCon();
stat=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=stat.executeQuery(zapt+nazwaTab);
}catch(SQLException e){System.out.println("Jakis blad: "+e.getMessage());}
}
private Statement stat;
private String nazwaTab;
private ResultSet rs;
private ModelTabeli model;
Po kompilacji i uruchomieniu programu i wyborze z listy tabeli otrzymuje komunikat:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ModelTabeli.<init>(ModelTabeli.java:23)
at SklepFrame.wyborTabActionPerformed(SklepFrame.java:111)
at SklepFrame.access$000(SklepFrame.java:23)
at SklepFrame$1.actionPerformed(SklepFrame.java:58)
at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1242)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:569)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:605)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:814)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
at java.awt.Component.processMouseEvent(Component.java:6041)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:480)
at java.awt.Component.processEvent(Component.java:5806)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4413)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4243)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2440)
at java.awt.Component.dispatchEvent(Component.java:4243)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
BUILD SUCCESSFUL (total time: 6 seconds)
Czy ktos potrafi mi pomoc i wskazac blad ?
Zastanawia mnie to rzutowania w konstruktorze modelu tabeli :
rsmd=(ResultSetMetaData) rs.getMetaData();
W ksiazce, ktora sie wspieram to przypisanie odbylo sie bez rzutowania, ale NetBeans sam zasugerowal wykonanie tego rzutowania bez tego sie nie kompiluje.