2015-09-25 81 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

該答案將複選框列放在表格的開頭,因此您需要修改代碼以將複選框放在最後。