2017-06-02 51 views
0

任何人都可以發現這段代碼有什麼問題嗎?我得到「java.lang.ClassCastException:java.lang.String不能轉換爲java.lang.Boolean。」AbstractTableModel生成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); 
     } 
    } 
} 

下面是實現它的方法:

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); 
} 

這裏是填充表的代碼。實例是在別處填充的ArrayList。

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); 
     } 
    } 
} 

任何想法?

這裏是堆棧跟蹤:

添加的行:名稱= Acme_e360_server,狀態=運行

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

你可以包含堆棧跟蹤嗎? – Mureinik

+1

或者至少告訴我們***。哪一個。行。*** –

+0

我添加了堆棧跟蹤。在我的代碼中沒有失敗。 – user3217883

回答

0

getValueAt方法setValueAt錯誤地期望的第一列是1。第一列數爲0.

這意味着您實際上並未返回第2列的布爾值,de儘管你的getColumnClass方法告訴Swing預計列2的布爾值。

+0

謝謝。我多麼愚蠢。我知道。最近一直在使用JDBC,其中參數是基於1的,而不是基於0的。我的腦子裏有1個基地! – user3217883