tabelle.setDefaultRenderer(Object.class,newMyRenderer());try{Connection con =DriverManager.getConnection("jdbc:hsqldb:file:Datenbank/....; shutdown=true","ROOT","");Statement stmt = con.createStatement();ResultSet rslt = stmt.executeQuery("select ID,Name,Preis fromTABELLE");
tabelle =newDefaultTableModel(){publicbooleanisCellEditable(int row,int column){returnfalse;}};Vector<String> clmHeader =newVector<String>();Vector<Object> dataVector =newVector<Object>();ResultSetMetaData rsmd = rslt.getMetaData();int clmCnt = rsmd.getColumnCount();for(int i =1; i <= clmCnt;i++){
clmHeader.addElement(rsmd.getColumnName(i));}while(rslt.next()){Vector<String> rowVector =newVector<String>();for(int i =1; i <= clmCnt; i++){
rowVector.addElement(rslt.getString(i));}
dataVector.addElement(rowVector);}
tabelle.setDataVector(dataVector,clmHeader);
stmt.close();
con.close();}catch(Exception f){}
jt_tabelle.setModel(tabelle);
jt_tabelle.setAutoCreateRowSorter(true);
jt_tabelle.getRowSorter().toggleSortOrder(1);
Das ist jetzt der Ursprungscode. Ich habe schon viel geändert und rumprobiert, aber es einfach nicht geschafft. Der wert Preis ist eine Kommazahl btw, also wenn das machbar ist, beides sortierbar zu machen, wäre es wunderbar
Du hast folgendes deklariert: Vector<String> rowVector
Daher werden alle Spalten auch in der Tabelle als Strings interpretiert. Hier musst du ansetzen.
tabelle.setDefaultRenderer(Object.class,newMyRenderer());try{Connection con =DriverManager.getConnection(...);Statement stmt = con.createStatement();ResultSet rslt = stmt.executeQuery("select ID,Name,Preis fromTABELLE");
tabelle =newDefaultTableModel(){@OverridepublicClassgetColumnClass(int column){switch(column){case0:returnInteger.class;case1:returnString.class;case2:returnDouble.class;default:returnString.class;}}publicbooleanisCellEditable(int row,int column){returnfalse;}};Vector<String> clmHeader =newVector<String>();Vector<Object> dataVector =newVector<Object>();ResultSetMetaData rsmd = rslt.getMetaData();int clmCnt = rsmd.getColumnCount();for(int i =1; i <= clmCnt;i++){
clmHeader.addElement(rsmd.getColumnName(i));}while(rslt.next()){Vector<Object> rowVector =newVector<Object>();for(int i =1; i <= clmCnt; i++){
rowVector.addElement(rslt.getObject(i));}
dataVector.addElement(rowVector);}
tabelle.setDataVector(dataVector,clmHeader);
stmt.close();
con.close();}catch(Exception f){}
jt_tabelle.setModel(tabelle);
jt_tabelle.setAutoCreateRowSorter(true);
jt_tabelle.getRowSorter().toggleSortOrder(1);
Nun sortiert er die Zahlen bei ID wie es soll. (Die Ausrichtung der Zahlen ist nun rechtsbündig, ein schneller Tipp, wie ich es wieder linksbündig bekommen kann wäre super )
Nur mit dem Preis habe ich noch Probleme, habe ich denn richtig verstanden, dass case die Position in der Tabelle dastellt? An dritter Position kommt ja der Preis in dieser Art (z.B. 20.50). So bekomme ich aber diesen Fehler:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number
at java.text.DecimalFormat.format(DecimalFormat.java:507)
at java.text.Format.format(Format.java:157)
at javax.swing.JTable$DoubleRenderer.setValue(JTable.java:5356)
at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(DefaultTableCellRenderer.java:257)
at javax.swing.JTable.prepareRenderer(JTable.java:5723)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114)
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016)
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:780)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JViewport.paint(JViewport.java:728)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1572)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1495)
at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
at javax.swing.JComponent._paintImmediately(JComponent.java:5167)
at javax.swing.JComponent.paintImmediately(JComponent.java:4978)
at javax.swing.RepaintManager$4.run(RepaintManager.java:824)
at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:749)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:719)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Du hast wahrscheinlich noch ein Problem mit dem Dezimalpunkt. Abhängig von der Lokalisierung kannst du ja die deutsche (= Komma) oder englische (= Punkt) Einstellung wählen.
Wenn dort "20.50" steht und du als Default "de" eingestellt hast, dann kann er das klarerweise nicht verstehen.
Erstmal danke für die ganze Hilfe, ich habe es nun so umgesetzt und es scheint zu klappen:
Java:
while(rslt.next()){Vector<Object> rowVector =newVector<Object>();for(int i =1; i <= clmCnt; i++){if(i==8){//8=Spalte mit den Double Werten
rowVector.addElement(rslt.getDouble(i));}else{
rowVector.addElement(rslt.getObject(i));}}
dataVector.addElement(rowVector);}