0

我正在AbstractTableModel为一个项目制作一个自定义 TableModel,我需要想办法让复选框显示在某些行上,而不是其他行上。我已经实现了一个 getColumn 方法,但我希望能够让一个复选框不显示,除非达到另一列中的某个条件(例如,如果由特定行表示的对象是一个灯泡,而不是说,烤面包机,给用户一个复选框来打开或关闭灯)。

我尝试使用 getValueAt 并传递 null 或字符串而不是布尔对象,希望 Swing 可能不会呈现复选框。它没有,但它也会抛出一组令人讨厌的 ClassCastExceptions 来尝试将 String 转换为 Boolean。

有人对我如何做这样的事情有任何想法吗?

4

1 回答 1

1

SwingJTable中的列使用单元格渲染器显示。您应该阅读Java 教程中的How to Use Tables,其中有一节描述了该机制的工作原理。这是自定义单元格渲染器的核心方法的样子:

public Component getTableCellRendererComponent(JTable table, Object color,
                        boolean isSelected, boolean hasFocus,
                        int row, int column) {

此方法的任务是为框架将在其上下文上使用的特定行和列选择和准备一个Component(通过设置所需的颜色、字体、图像......) 。Graphics有一个DefaultTableCellRenderer可以在没有太多自定义代码的情况下解决问题(参见教程)。请注意,此呈现机制是 Swing 开发人员选择的优化。

您还可以在Swing Hacks中学到很多关于自定义 Swing 组件的知识。这些示例并不是特别精心设计的代码,只是展示了如何创造性地使用 Swing API。

祝你好运!

示例(见评论):

    final JTable orderTable = new JTable(dataModel);
    // All columns with class Boolean are renderered with MyFancyItemRenderer
    orderTable.setDefaultRenderer(Boolean.class, new MyFancyItemRenderer());

    // Setting the cell renderers explicitly for each column
    final TableColumnModel columnModel = orderTable.getColumnModel();

    final TableColumn itemCountColumn = columnModel.getColumn(ITEM_COUNT);
    itemCountColumn.setCellRenderer(new MyFancyItemRenderer());

    // ...

    final TableColumn sumColumn = columnModel.getColumn(SUM);
    sumColumn.setCellRenderer(new MyFancyPriceRenderer());
于 2013-06-05T17:53:38.173 回答