2015-09-25 76 views
2

我有这个代码,它可以显示数据库中的数据。它运行良好,但我希望它在最后一栏有复选框。我在这里找到了一些代码,但它仅用于预先定义的非值,而不是来自数据库。 (How to add checkboxes to JTABLE swingJava结果集与JTable与复选框

截图:

Here is my screenshot of my JTable:

代码:

public print() { 
    initComponents(); 
    try{ 
     conn = (Connection) db_connect.connectDB(); 
    } 
    catch(ClassNotFoundException | SQLException ex){ 
     JOptionPane.showMessageDialog(null, ex); 
    } 
    update_table("select name, section, student_number, gender from students"); 
} 

public void update_table(String q){ 
    try{ 
      st= conn.createStatement(); 
      st.executeQuery(q); 
      ResultSet rs = st.executeQuery(q); 
      users_list.setModel(DbUtils.resultSetToTableModel(rs)); 

      users_list.getColumnModel().getColumn(0).setPreferredWidth(250); 
      users_list.getColumnModel().getColumn(0).setPreferredWidth(250); 
      users_list.getColumnModel().getColumn(1).setPreferredWidth(150); 
      users_list.getColumnModel().getColumn(2).setPreferredWidth(120); 
      users_list.getColumnModel().getColumn(3).setPreferredWidth(100); 

      int count= users_list.getModel().getRowCount(); 
      if(count==0){ 
       no_results_found.setVisible(true); 
      } 
      else{ 
       no_results_found.setVisible(false); 
      } 
    } 
    catch(SQLException ex){ 
     JOptionPane.showMessageDialog(null,ex);  
    } 
} 
+0

国际海事组织你首先需要在最后一栏有一个复选框的表。然后你想根据数据库值设置复选框。所以请用表格显示你的代码,包括复选框。 – 0X0nosugar

+0

这是不相关的,但是你执行查询两次 –

+0

可能重复的[如何呈现JTable中的复选框?](http://stackoverflow.com/questions/4154802/how-to-render-a-checkbox -in-A-的JTable) – roeygol

回答

0

你可以尝试这样的事情:

public class JTableWithCheckBox { 

    private JFrame mainFrame; 
    private JTable studentTable; 
    private JScrollPane scrollPaneTable; 

    private DefaultTableModel model = new DefaultTableModel(new Object[][] { 
      { "Ramesh", "Male" }, { "Sheela", "Female" }, 
      { "Amithabh", "Male" }, { "Katrina", "Female" } }, new Object[] { 
      "Name", "Gender" }); 

    public static void main(String[] args) { 
     final JTableWithCheckBox ui = new JTableWithCheckBox(); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       ui.initGUI(); 
      } 
     }); 
    } 

    private void initGUI() { 
     mainFrame = new JFrame("View"); 
     mainFrame.getContentPane().setLayout(new BorderLayout()); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(300, 200); 
     mainFrame.setVisible(true); 
     mainFrame.setLocationRelativeTo(null); 

     studentTable = new JTable(model); 
     studentTable.getColumnModel().getColumn(1) 
       .setCellRenderer(new MFCheckBox()); 
     scrollPaneTable = new JScrollPane(studentTable); 
     mainFrame.add(scrollPaneTable, BorderLayout.NORTH); 

    } 

    private class MFCheckBox implements TableCellRenderer { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, 
       Object value, boolean isSelected, boolean hasFocus, int row, 
       int column) { 
      JPanel cbPanel = new JPanel(); 
      JCheckBox maleBox = new JCheckBox("Male"); 
      JCheckBox femaleBox = new JCheckBox("Female"); 

      cbPanel.setLayout(new BorderLayout()); 
      cbPanel.add(maleBox, BorderLayout.WEST); 
      cbPanel.add(femaleBox, BorderLayout.EAST); 

      if (value != null) { 
       if (value instanceof String) { 
        String valStr = (String) value; 
        switch (valStr) { 
        case "Male": 
         maleBox.setSelected(true); 
         femaleBox.setSelected(false); 
         break; 
        case "Female": 
         maleBox.setSelected(false); 
         femaleBox.setSelected(true); 
         break; 
        default: 
         maleBox.setSelected(false); 
         femaleBox.setSelected(false); 
         break; 
        } 
       } 
      } 
      return cbPanel; 
     } 
    } 
} 

如果您还希望复选框可编辑,您还必须设置TableCellEditor。

0

最简单的方法是不要使用DBUtils并自己将数据从ResultSet加载到TableModel中。

该代码并不困难,您可以使用Table From Database中的Table From Database Example作为起点。

该代码只是将ResultSet中的数据加载到Vectors中,因此您可以手动添加另一列来包含布尔数据。

的代码的变化会是这样的:

// Get column names 

for (int i = 1; i <= columns; i++) 
{ 
    columnNames.addElement(md.getColumnName(i)); 
} 

columnName.addElement("Check Mark"); // added 

// Get row data 

while (rs.next()) 
{ 
    Vector<Object> row = new Vector<Object>(columns); 

    for (int i = 1; i <= columns; i++) 
    { 
     row.addElement(rs.getObject(i)); 
    } 

    row.addElement(Boolean.FALSE); // added 
    data.addElement(row); 
} 

另一种选择是创建一个“包装” TableModel的一个包装与DBUtils TableModel创建一个布尔列。有关此方法的示例,请查看How to add checkbox in Jtable populated using rs2xml

该答案将复选框列放在表格的开头,因此您需要修改代码以将复选框放在最后。