2011-04-20 58 views
0

在谷歌和stackoverflow中搜索後,並通過一些答案我仍然堅持這個問題。添加jcheckBox到Jtable使用GUI

我已經jtable,我從數據庫(derpy-JDBC)填充它。 我想添加複選框以我的JTable使用GUI ..我有零錢列類型爲布爾值,並添加這些行

JCheckBox checkBox = new javax.swing.JCheckBox(); 
jTable1.getColumn("status").setCellEditor(new DefaultCellEditor(checkBox)); 

,但它不能正常工作。 這個我嘗試

public class showp1 extends javax.swing.JFrame implements ActionListener { 

    /** Creates new form showp1 */ 
    public showp1() { 
     initComponents(); 
     this.setLocationRelativeTo(null); 
     jButton1.addActionListener(this); 
     jButton2.addActionListener(this); 
     jTextField1.addActionListener(this); 

    } 

    /** This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTable1 = new javax.swing.JTable(); 
     jButton1 = new javax.swing.JButton(); 
     jButton2 = new javax.swing.JButton(); 
     jTextField1 = new javax.swing.JTextField(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     addWindowListener(new java.awt.event.WindowAdapter() { 
      public void windowOpened(java.awt.event.WindowEvent evt) { 
       formWindowOpened(evt); 
      } 
     }); 

     jTable1.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] { 
       {null, null, null, null}, 
       {null, null, null, null}, 
       {null, null, null, null}, 
       {null, null, null, null} 
      }, 
      new String [] { 
       "id", "area", "location", "status" 
      } 
     ) { 
      Class[] types = new Class [] { 
       java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Boolean.class 
      }; 

      public Class getColumnClass(int columnIndex) { 
       return types [columnIndex]; 
      } 
     }); 
     jScrollPane1.setViewportView(jTable1); 

     jButton1.setText("jButton1"); 

     jButton2.setText("jButton2"); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
         .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
          .addComponent(jButton1) 
          .addGap(73, 73, 73) 
          .addComponent(jButton2) 
          .addGap(166, 166, 166)) 
         .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
          .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)))) 
       .addGap(10, 10, 10)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 23, Short.MAX_VALUE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(18, 18, 18) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jButton1) 
        .addComponent(jButton2)) 
       .addGap(64, 64, 64)) 
     ); 

     pack(); 
    }// </editor-fold>       

private void formWindowOpened(java.awt.event.WindowEvent evt) {         

     myDbConnection dbconnect; 
     // TODO add your handling code here: 


       ArrayList<String> list = new ArrayList<String>(); 
     try { 

     dbconnect = new myDbConnection(); 
      ResultSet resultSet =null; 
      resultSet = dbconnect.excuteQuery("SELECT id, area,location, status1 FROM pledges "); 



       while (resultSet.next()){ 
        list.add(resultSet.getString(1)); 
        list.add(resultSet.getString(2)); 
        list.add(resultSet.getString(3)); 
        list.add(resultSet.getString(4)); 
       } 


     } catch (Exception e) { 
      System.out.println(e); 
     } 

     Object[][] record; 

     int myListCount = list.size()/4; 
     record = new Object[myListCount][4]; 
     int count = 1; 
     // JCheckBox checkBox = new javax.swing.JCheckBox(); 
     for (int ii = 1; ii<=myListCount;ii++) { 
      for(int i=1;i<=4;i++){ 
       record[ii-1][i-1] = list.get(count-1); 
       count++; 

      } 

     } 
     //TableColumnModel columnModel = jTable1.getColumnModel(); 
     //columnModel.getColumn(3).setCellEditor(new DefaultCellEditor(checkBox)); 

     jTable1.setModel(new DefaultTableModel(record, new String[]{"id", "area", "location","status1"}) { 
     @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     if (getColumnName(columnIndex).equals("status1")) { 
      return Boolean.class; 
     } 
     return super.getColumnClass(columnIndex); 
    } 
    }); 


public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new showp1().setVisible(true); 
      } 
     }); 
} } 

對不起,這個可怕的代碼^^」 由於事先

+0

好吧,試着檢查我的帖子,瞭解如何在JTable的每一行添加JToggleButton。在我的示例代碼中,我放置了一個布爾類型的列。它告訴你,如果你想在布爾類型的列的每一行上有「JCheckBox」,你不需要特別渲染'jCheckBox'因爲默認情況下'DefaultTableModel'會自動將這樣的列渲染爲'JCheckBox'類模型http://stackoverflow.com/questions/5334444/customized-jtable-look/5334562#5334562 – eee 2011-04-21 01:31:44

+0

@eee while your example is創意 - 這是完全反對擺動的風;-) – kleopatra 2011-04-30 13:46:42

+0

請學習和使用java命名約定 – kleopatra 2011-04-30 13:47:14

回答

2

閱讀Oracle Swing JTable tutorial,你會看到,你不需要直接使用單元格渲染器或編輯器,你需要做的就是返回正確的Boolean.class列類,Swing將爲你提供正確的渲染器和編輯器,這是通過覆蓋TableModel的getColumnClass(int列)方法來完成的。

例如,

jTable1.setModel(new DefaultTableModel(record, new String[]{"id", "area", "location", 
    "status1"}) { 
    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     if (getColumnName(columnIndex).equals("status1")) { 
      return Boolean.class; 
     } 
     return super.getColumnClass(columnIndex); 
    } 
    }); 

請注意,對於此工作記錄,需要是Object [] []的2維數組,而不是String [] [],並且status1列必須保存布爾數據,而不是String數據,但是應該很容易讓您在嵌套for循環中填充記錄數組時解決問題。

+0

我更新了我的問題中的代碼,並做了你所說的每一件事(改變記錄到對象和狀態1列保存布爾數據),但仍然顯示給我錯誤消息 – 2011-04-20 16:05:28

+0

請不要在數據庫中列的名稱是「status1」,並且在Jtable中是「status」,並且jtable中此列的類型是布爾值,並且在數據庫中是整數 – 2011-04-20 16:15:02

+0

@mbasleem:Ad d你的問題的附錄顯示了你使用我的想法在你的代碼解決方案上的最新嘗試。如果你可以發佈一個小的可編譯程序來顯示你的嘗試,那麼我們可以運行一個不需要使用數據庫的程序 - 一個[SSCCE](http://SSCCE.org) – 2011-04-20 20:55:15