如何在JTable中添加JCheckBox?

首先,我为我的英语疏忽道歉,我将解释我的所有问题。

首先,我想要JTable中的JCheckBox。

我正在从索引0和1列中的数据库中检索学生ID和学生姓名。我希望第三列应该是缺席/现在,这将最初取决于学生是否存在JCheckbox Value。

这里是JTable值的代码:

Attendance.java

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package shreesai; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; /** * * @author Admin */ public class Attendance{ Connection con = Connectdatabase.ConnecrDb(); public Vector getEmployee()throws Exception { Vector<Vector> employeeVector = new Vector<Vector>(); PreparedStatement pre = con.prepareStatement("select studentid,name from student"); ResultSet rs = pre.executeQuery(); while(rs.next()) { Vector employee = new Vector(); employee.add(rs.getString(1)); //Empid employee.add(rs.getString(2));//name employeeVector.add(employee); } if(con!=null) con.close(); rs.close(); pre.close(); return employeeVector; } } 

从数据库中获取价值的这个代码将其保存到矢量中

AttendanceGUI.java

 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package shreesai; import static java.awt.Frame.MAXIMIZED_BOTH; import java.util.Vector; import javax.swing.JOptionPane; /** * * @author Admin */ public class AttendanceGUI extends javax.swing.JFrame { /** * Creates new form AttendanceGUI */ private Vector<Vector> data; private Vector header; public AttendanceGUI() throws Exception { this.setLocationRelativeTo(null); setExtendedState(MAXIMIZED_BOTH); Attendance att = new Attendance(); data = att.getEmployee(); header = new Vector(); header.add("Student ID"); header.add("Student Name"); header.add("Absent/Present"); initComponents(); } /** * 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") //  private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); AttendanceT = new javax.swing.JTable(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); AttendanceT.setModel(new javax.swing.table.DefaultTableModel( data,header )); jScrollPane1.setViewportView(AttendanceT); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(397, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(89, Short.MAX_VALUE)) ); pack(); }//  /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { try{ new AttendanceGUI().setVisible(true); } catch(Exception e){ JOptionPane.showMessageDialog(null,e); } } }); } // Variables declaration - do not modify private javax.swing.JTable AttendanceT; private javax.swing.JScrollPane jScrollPane1; // End of variables declaration } 

我的问题是我无法在每个学生面前添加JCheckBox我看过JTabel模型,渲染器和所有但我没有得到任何东西。 我想要这样的东西……

在此处输入图像描述

我已经搜索了这个东西几个星期但是机器人得到了适合这个的东西

从如何使用表开始 。

你的桌面模型需要几件事。

  1. 它需要从适当列的getColumnClass方法返回Boolean.class 。 您需要覆盖此方法。
  2. 方法isCellEditable将需要为要编辑的表列返回true (因此用户可以更改列的值)
  3. 您的表模型需要能够保存列的值
  4. 确保为行的boolean列传递有效值,否则它将为null

更新了简单的示例

在此处输入图像描述

 import java.awt.EventQueue; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.DefaultTableModel; public class TableTest { public static void main(String[] args) { new TableTest(); } public TableTest() { startUI(); } public void startUI() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } MyTableModel model = new MyTableModel(); model.addRow(new Object[]{0, "Brian", false}); model.addRow(new Object[]{1, "Ned", false}); model.addRow(new Object[]{2, "John", false}); model.addRow(new Object[]{3, "Drogo", false}); JTable table = new JTable(model); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class MyTableModel extends DefaultTableModel { public MyTableModel() { super(new String[]{"ID", "Name", "Present"}, 0); } @Override public Class getColumnClass(int columnIndex) { Class clazz = String.class; switch (columnIndex) { case 0: clazz = Integer.class; break; case 2: clazz = Boolean.class; break; } return clazz; } @Override public boolean isCellEditable(int row, int column) { return column == 2; } @Override public void setValueAt(Object aValue, int row, int column) { if (aValue instanceof Boolean && column == 2) { System.out.println(aValue); Vector rowData = (Vector)getDataVector().get(row); rowData.set(2, (boolean)aValue); fireTableCellUpdated(row, column); } } } } 

Ps-我强烈建议你避免使用表单编辑器,直到你更好地了解Swing如何工作 – 恕我直言

好吧,如果将Boolean值作为数据添加到表模型中, DefaultCellRendered会将其自身呈现为checbox,那么问题出在哪里?