当前位置: 首页 > 知识库问答 >
问题:

创建了带有多个复选框和渲染到JTable单元格的Jpanel,导致问题

韦嘉颖
2023-03-14

我创建了自定义单元渲染器,该渲染器从方法getTableCellRendererComponent中获取参数,并基于值列表创建复选框,值列表是整数的列表。

问题是,当拖动窗口或调整其大小时,会多次调用渲染器,并且面板会在JTable的单元格中多次添加,从而导致重复的JCheckBox。

渲染器:

public class CheckBoxCellRenderer extends JPanel implements TableCellRenderer {
    private static final long serialVersionUID = -6142180432465856711L;
    JPanel panel = new JPanel(new FlowLayout());

    public CheckBoxCellRenderer() {
        setOpaque(true);
    }
    
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if(value!=null){
            Set<Integer> intValues = (Set<Integer>) value;  
            for(Integer intvalue : intValues){
                panel.add(new JCheckBox(intvalue.toString()));
            }
        }
    //  panel.add(this);
    //  table.setRowHeight(row, this.getPreferredSize().height);
        panel.revalidate();
        panel.repaint();
        return panel;
    }
}

单元格编辑器:

class CheckBoxCellEditor extends AbstractCellEditor implements TableCellEditor{
    private static final long serialVersionUID = 7910769369831526953L;
    JPanel panel = new JPanel(new FlowLayout());

    @Override
    public Object getCellEditorValue() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {     
        //table.setRowHeight(25);
        //table.setCellSelectionEnabled(true);
        if(value!=null){
            Set<Integer> intValues = (Set<Integer>) value;  
            for(Integer intvalue : intValues){
                panel.add(new JCheckBox(intvalue.toString()));
            }
        }
         
        //table.setRowHeight(row, panel.getPreferredSize().height);
        return panel;
    }
}

主面板:
信息表是模型表)

infoTable.getColumnModel().getColumn(2).setCellRenderer(new CheckBoxCellRenderer());
infoTable.getColumnModel().getColumn(2).setCellEditor(new CheckBoxCellEditor());
infoTable.addNewRows(modelList);

共有1个答案

窦伟
2023-03-14

您需要知道,通常只创建一个TableCellRenderer实例,它用于渲染JTable中的每个单元格。

每次需要重新绘制JTable时,都会调用方法GetTableCellRenderComponent。显然,当您拖动或调整JTable的大小时,需要重新绘制它。

一个简单的解决方案是首先从JPanel中删除所有JCheckBox,然后再添加新的。

请注意,类JPanel的默认布局管理器是FlowLayout,因此无需显式设置。

public class CheckBoxCellRenderer implements TableCellRenderer {
    private static final long serialVersionUID = -6142180432465856711L;
    JPanel panel = new JPanel();
    
    @Override
    public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus,
                                                   int row,
                                                   int column) {
        if(value!=null){
            panel.removeAll();
            Set<Integer> intValues = (Set<Integer>) value;  
            for(Integer intvalue : intValues){
                panel.add(new JCheckBox(intvalue.toString()));
            }
        }
        return panel;
    }
}
 类似资料:
  • 问题内容: 假设我有以下JTable,只要按下一个按钮,就会显示该JTable: 我想呈现 最初 对JCheckBox 为真的单元格,以及所有 最初为 false的所有单元格不显示任何内容(无JCheckBox)。用户可以选中或取消选中最初为真的单元格中的JCheckBoxes,这会对我创建的图表有所帮助。 现在,我的单元格渲染器在所有单元格中显示JCheckBoxes,包括最初为false的单元

  • 问题内容: 我正在跟踪发现的一些代码,(是的,我知道它是如何工作的)它来自这里:代码链接 我想做的是如果单元格值设置为“黄色”,则设置单元格前景色 这是我的代码: 和单元格渲染器 问题是,如果我将任何单元格值设置为“黄色”,它就不会改变 提前致谢! 问题答案: 您的渲染器曾经使用过吗?您将其设置为包含String的单元格的默认渲染器,但是是否重载了模型的方法,以便它知道某些单元格包含String

  • 问题内容: 我有一个JTable,我想用自定义渲染器尝试检查isEnabled()的所有禁用的复选框单元变灰,然后更改背景颜色,但仍然无法使用。有什么建议么?谢谢!!! 问题答案: 如“ 概念:编辑器和渲染器 ”中所述,“通常使用单个单元格渲染器来绘制包含相同类型数据的所有单元格。” 您需要维护表模型中的enabled状态。 附录:作为一个具体示例,此示例中的数据模型是一组简单的Date实例。ge

  • 单元格渲染器: 将JChecboxs添加到面板: [在此输入图片描述][1] 强文本[1]:https://i.stack.imgur.com/D8Mhs.png 请查找所附图像。

  • 问题内容: 你们真是太棒了,为我在最后一个问题上指明了正确的方向,我在这里对我原来的问题进行了扩展: 如何将JTable列设置为String并排序为Double? 由于现在我使用自定义单元格渲染器将价格列的格式设置为$ ###,## 0.00,因此我现在还为该单元格设置了JTextField编辑器。单元格的编辑工作正常,除了更新值时,自定义渲染器中设置的数字格式似乎不再格式化单元格(在提交编辑后,

  • 我在jtable中添加复选框时遇到了一点问题。我的jtable中有四列,最后两列有复选框。jtable中的数据来自我的数据库。这是我的错误“线程中的异常”AWT-EventQueue-0“java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Boolean”,在我的数据库中有两个“是/否”列,分别是“存在”和“超时”。如何解决此