我创建了自定义单元渲染器,该渲染器从方法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);
您需要知道,通常只创建一个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”,在我的数据库中有两个“是/否”列,分别是“存在”和“超时”。如何解决此