【问题标题】:Can't create column with checkboxes in JTable无法在 JTable 中创建带有复选框的列
【发布时间】:2015-11-20 03:55:48
【问题描述】:

我有 JTable,我用 SQL 数据填充它,这是我的方法:

private void updateTable() {
    try {
        String sql = "SELECT number as Numver, name as Available, type FROM available_t ORDER BY number asc";
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();
        tableAvail.setModel(DbUtils.resultSetToTableModel(rs));

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    } finally {
        try {
            rs.close();
            pst.close();
        } catch (Exception e) {
        }
    }
}

到目前为止一切顺利。数据显示正确。但是,我想再放一列带有复选框。当我尝试在 Eclipse 中使用向导手动创建(按钮“模型”)时,我无法添加新列,可能是因为表和列是通过方法创建的。那么,我如何添加新列,它将有复选框。然后在我选择了一些复选框后 - 当我按下 OK 按钮时,检查哪些复选框被选中并在 db 中的 TYPE 列中使用 YES 或 NO 更新它。

编辑:*** 这是我的代码,我只想将结果 true/false 转换为列中的复选框:

private JPanel contentPane;
private final JPanel panel = new JPanel();
private final JScrollPane scrollPane = new JScrollPane();
private final JTable table = new JTable();

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                TableExample frame = new TableExample();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public TableExample() {
    initGUI();
}
private void initGUI() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    panel.setBounds(31, 11, 238, 209);

    contentPane.add(panel);
    panel.setLayout(null);
    scrollPane.setBounds(10, 11, 218, 187);

    panel.add(scrollPane);
    table.setModel(new DefaultTableModel(
        new Object[][] {
            {"1", "Test1", "20", "false"},
            {"2", "Test2", "10", "false"},
            {"3", "Test3", "20", "true"},
        },
        new String[] {
            "Id", "Test", "Rate", "T/F"
        }
    ));

    scrollPane.setViewportView(table);
}

【问题讨论】:

  • 拜托你读过 Oracle 官方教程 - 如何使用 Table,实际上大部分部分都是关于(或包括一些关于)的,DbUtils 的快捷方式必须返回正确的数据类型
  • 是的,我读过,我尝试过,但我还在学习java,很难理解。
  • short_cut 一个 DbUtils 必须返回一个布尔值
  • default renderer/editor 应该可以工作。如果没有,请编辑您的问题以包含一个complete example,以显示您的方法。
  • mKorbel,我不明白什么是short_cut :) trashgod,所以,可以说,我现在想用表格中的这些数据添加一个带有复选框的列,然后我将尝试检查是否选中了某个复选框,以调用 SQL 查询以在数据库中更新。

标签: java swing checkbox jtable


【解决方案1】:

您需要重写 getColumnClass(...) 方法以返回列中数据的类,以便表格可以使用正确的渲染器/编辑器。

类似:

JTable table = new JTable( model )
{
    @Override
    public Class getColumnClass(int column)
    {
        for (int row = 0; row < getRowCount(); row++)
        {
            Object o = getValueAt(row, column);

            if (o != null)
            {
                return o.getClass();
            }
        }

        return Object.class;
    }
};

【讨论】:

    【解决方案2】:

    谢谢大家。这是我创造的完美作品

    public void updateTable() throws ClassNotFoundException, SQLException {
     String sql = "select * from instruments_sales_t where sold = 'YES'";
     conn = ConnectionToDb.connectDb();
     stmt = conn.createStatement();
     rs = stmt.executeQuery(sql);
    
    
     DefaultTableModel model = new DefaultTableModel() {
     public Class<?> getColumnClass(int column) {
     switch (column) {
    
     case 0: return String.class;
     case 1: return String.class;
     case 2: return String.class;
     case 3: return String.class;
     case 4: return String.class;
     case 5: return String.class;
     case 6: return String.class;
     case 7: return Boolean.class;
    
     default:return String.class;
     }
     }
     };
    
    
     tablePaidSales.setModel(model);
     model.addColumn("id");
     model.addColumn("Name");
     model.addColumn("Size");
     model.addColumn("Avail");
     model.addColumn("Total");
     model.addColumn("Cl");
     model.addColumn("Date");
     model.addColumn("");
    
     int i = 0;
     while (rs.next()) {
     model.addRow(new Object[0]);
     model.setValueAt(rs.getString("id"), i, 0);
     model.setValueAt(rs.getString("name"), i, 1);
     model.setValueAt(rs.getString("size"), i, 2);
     model.setValueAt(rs.getString("want_items"), i, 3);
     model.setValueAt((rs.getDouble("want_price"))*(rs.getDouble("want_items")), i, 4);
     model.setValueAt(rs.getString("client"), i, 5);
     model.setValueAt(rs.getString("date_of_sell"), i, 6);
     model.setValueAt(false, i, 7);
     i++;
     }
    
          DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
          rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
     rightRenderer.setForeground(Color.BLUE);
    
     DefaultTableCellRenderer redRenderer = new DefaultTableCellRenderer();
     redRenderer.setHorizontalAlignment(JLabel.RIGHT);
     redRenderer.setForeground(Color.RED);
    
     tablePaidSales.setShowGrid(true);
     tablePaidSales.setGridColor(Color.LIGHT_GRAY);
     tablePaidSales.setShowHorizontalLines(false);
     tablePaidSales.getColumnModel().getColumn(0).setPreferredWidth(28);
     tablePaidSales.getColumnModel().getColumn(1).setPreferredWidth(230);
     tablePaidSales.getColumnModel().getColumn(2).setPreferredWidth(140);
     tablePaidSales.getColumnModel().getColumn(3).setPreferredWidth(57);
     tablePaidSales.getColumnModel().getColumn(4).setPreferredWidth(70);
     tablePaidSales.getColumnModel().getColumn(5).setPreferredWidth(120);
     tablePaidSales.getColumnModel().getColumn(6).setPreferredWidth(82);
     tablePaidSales.getColumnModel().getColumn(7).setPreferredWidth(25);
     tablePaidSales.getColumnModel().getColumn(3).setCellRenderer(rightRenderer);
     tablePaidSales.getColumnModel().getColumn(4).setCellRenderer(redRenderer);
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多