簡體   English   中英

Java結果集到帶有復選框的JTable

[英]Java Resultset to JTable with Checkbox

我有此代碼,它可以顯示數據庫中的數據。 它運行良好,但我希望它在最后一列具有復選框。 我在這里找到了一些代碼,但這僅用於預定義的值而不是數據庫中的值。 如何向JTABLE swing添加復選框

截圖:

這是我的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);    
    }
}

您可以嘗試如下操作:

    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。

最簡單的方法是不使用DBUtils並將數據從ResultSet加載到TableModel`中。

代碼並不難,您可以使用“ Table From Database Example中的表”中的“數據庫中的表” 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包裝一個布爾列。 請查看如何在使用rs2xml填充的Jtable中添加復選框,以獲取此方法的示例。

該答案將復選框列放在表的開頭,因此您需要修改代碼以將復選框放在表的末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM