2017-06-02 7 views
0

Kann jemand herausfinden, was mit diesem Code falsch ist? Ich bekomme "java.lang.ClassCastException: java.lang.String kann nicht in java.lang.Boolean umgewandelt werden."AbstractTableModel produziert ClassCastException

class MyTableModel extends AbstractTableModel { 
    private String[] columnNames = {"Name","State","Start","Stop","Terminate"}; 
    private List<Row> rows = new ArrayList<Row>(); 

    @Override 
    public int getColumnCount() { 
     return columnNames.length; 
    } 

    @Override 
    public int getRowCount() { 
     return rows.size(); 
    } 

    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    @Override 
    public Object getValueAt(int row, int col) { 
     Row targetRow = rows.get(row); 
     switch (col) { 
      case 1: return targetRow.name; 
      case 2: return targetRow.state; 
      case 3: return targetRow.start; 
      case 4: return targetRow.stop; 
      case 5: return targetRow.terminate; 
     } 
     return null; 
    } 

    /* 
    * JTable uses this method to determine the default renderer/ 
    * editor for each cell. If we didn't implement this method, 
    * then the last column would contain text ("true"/"false"), 
    * rather than a check box. 
    */ 
    @Override 
    public Class<?> getColumnClass(int c) { 
     Class[] colTypes = new Class[]{String.class,String.class,Boolean.class,Boolean.class,Boolean.class}; 
     return colTypes[c]; 
    } 

    @Override 
    public boolean isCellEditable(int row, int col) { 

     String state = (String)getValueAt(row,1); 
     if (state.equals("running")) {  //instance is running 
      if (col==2) return false;  //disable start checkbox if already running 
      else if (col>2) return true; //enable stop and terminate 
     } 
     else {          //instance is stopped 
      if (col==3) return false;    //disable stop checkbox 
      else if (col==2 || col==4) return true; //enable start and terminate 
     } 
     return false; 
    } 

    @Override 
    public void setValueAt(Object value, int row, int col) { 
     Row targetRow = rows.get(row); 
     switch (col) { 
      case 1: targetRow.name  = (String)value; break; 
      case 2: targetRow.state  = (String)value; break; 
      case 3: targetRow.start  = (Boolean)value; break; 
      case 4: targetRow.stop  = (Boolean)value; break; 
      case 5: targetRow.terminate = (Boolean)value; break; 
     } 
     fireTableCellUpdated(row, col); 
    } 

    public void addRow(String name, String state) { 
     Row row = new Row(name,state); 
     rows.add(row); 
    } 

    private class Row { 
     String name; 
     String state; 
     Boolean start; 
     Boolean stop; 
     Boolean terminate; 

     public Row(String name, String state) { 
      this.name = name; 
      this.state = state; 
      this.start = new Boolean(false); 
      this.stop = new Boolean(false); 
      this.terminate = new Boolean(false); 
     } 
    } 
} 

Hier ist die Methode, die es implementiert:

private void initTable() { 
    tbInstances = new JTable(new MyTableModel()); 
    tbInstances.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
    tbInstances.setFillsViewportHeight(true); 
    populateInstancesTable(); 

    //Create the scroll pane and add the table to it. 
    JScrollPane scrollPane = new JScrollPane(tbInstances); 
    tabStartStop.setLayout(new BorderLayout()); 
    tabStartStop.add(scrollPane); 
} 

Und hier ist der Code, der die Tabelle auffüllt. instances ist eine ArrayList, die an anderer Stelle gefüllt wird.

private void populateInstancesTable() { 
    String name = null; 
    for (Instance instance:instances) { 
     List<Tag> tags = instance.getTags(); 
     for (Tag tag: tags) { 
      if (tag.getKey().equals("Name")) { 
       name = tag.getValue(); 
       break; 
      } 
     } 
     String state = instance.getState().getName(); 
     if (name.contains("_e360")) { 
      MyTableModel model = (MyTableModel)tbInstances.getModel(); 
      model.addRow(name,state); 
      System.out.println("added row: name="+name+", state="+state); 
     } 
    } 
} 

Irgendwelche Ideen? Hier

ist der Stack-Trace:

hinzugefügt Reihe: name = Acme_e360_server, state = Lauf

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean 
    at javax.swing.plaf.synth.SynthTableUI$SynthBooleanTableCellRenderer.getTableCellRendererComponent(SynthTableUI.java:730) 
    at javax.swing.JTable.prepareRenderer(JTable.java:5723) 
    at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:683) 
    at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:580) 
    at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:364) 
    at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:275) 
    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.paintToOffscreen(JComponent.java:5210) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579) 
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1272) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5158) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4969) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:831) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) 
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    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) 
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean 
    at javax.swing.plaf.synth.SynthTableUI$SynthBooleanTableCellRenderer.getTableCellRendererComponent(SynthTableUI.java:730) 
    at javax.swing.JTable.prepareRenderer(JTable.java:5723) 
    at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:683) 
    at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:580) 
    at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:364) 
    at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:275) 
    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.paintToOffscreen(JComponent.java:5210) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579) 
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1272) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5158) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4969) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:831) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) 
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    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) 
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean 
    at javax.swing.plaf.synth.SynthTableUI$SynthBooleanTableCellRenderer.getTableCellRendererComponent(SynthTableUI.java:730) 
    at javax.swing.JTable.prepareRenderer(JTable.java:5723) 
    at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:683) 
    at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:580) 
    at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:364) 
    at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:275) 
    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.paintToOffscreen(JComponent.java:5210) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579) 
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1272) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5158) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4969) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:831) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) 
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    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) 
+0

Können Sie den StackTrace einschließen? – Mureinik

+1

Oder erzähl uns wenigstens ***. welche. Linie. *** –

+0

Ich habe den Stacktrace hinzugefügt. Nicht in meinem Code versagt. – user3217883

Antwort

0

Ihre getValueAt und setValueAt Methoden falsch die erste Spalte erwarten 1. Die sein Die erste Spaltennummer ist 0.

Dies bedeutet, dass Sie tatsächlich keinen booleschen Wert für Spalte 2, de Trotz Ihrer getColumnClass Methode sagt Swing, einen booleschen Wert für Spalte 2 zu erwarten.

+0

Vielen Dank. Wie dumm von mir. Ich wusste, dass. Habe in letzter Zeit mit JDBC gearbeitet, wo die Parameter 1-basiert und nicht 0-basiert sind. Hatte 1-Base in meinen Gedanken! – user3217883

Verwandte Themen