2011-04-20 62 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