我遇到了一个我无法摆脱的问题。
您知道,我对使用JTables相当新,所以答案可能很简单,但我找不到解决方案:/
所以,我有一个使用AbstractTableModel的JTable,它覆盖了
public Class<?> getColumnClass(int columnIndex_p)
方法,告诉要显示的每列的类型。其中一个是布尔值。
当我使用
创建一个简单的JTable时 table_l = new JTable(new MyTableModel());
一切正常,使用复选框(开/关)正确显示布尔值。
现在,我想将文本集中在每个单元格上(以后可能会有更多选项)。
所以我为每一列定义了一个新的DefaultTableCellRenderer,如下所示:
DefaultTableCellRenderer cellRenderer_l = new DefaultTableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
// delegate the rendering part to the default renderer (am i right ???)
Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
return comp;
}
}
然后我只需将此CellRender的水平对齐设置为:
cellRenderer_l.setHorizontalAlignment(JLabel.CENTER);
然后我在JTable的每一列上安装这个新的CellRenderer:
for (int i = 0; i < table_l.getColumnCount(); ++i) {
table_l.getColumnModel().getColumn(i).setCellRenderer(cellRenderer_l);
}
但是,使用新的CellRenderer,显示的JTable不再使用我的TableModel的getColumnClass()方法,因此只在布尔值上显示“true / false”字符串。
我不知道如何让它仍像以前一样使用getColumnClass()。
如果有人有答案...... 谢谢
编辑: 感谢您所做的所有澄清。 事实上,我真正的问题是:“如何影响JTable的所有DefaultRenderer,使它们的结果集中在JTable的单元格中”
答案 0 :(得分:5)
默认单元格renderer已针对Boolean.class
类型的值执行此操作,如here所示。如果这还不够,请修改您的问题以包含显示您遇到的任何问题的sscce。
附录:如果您需要进一步自定义DefaultTableCellRenderer
,请使用setDefaultRenderer()
指定适用类型的渲染器,如图here所示。
table.setDefaultRenderer(Boolean.class, yourCellRenderer);
答案 1 :(得分:2)
为了将相同的视觉装饰应用于所有渲染组件(如果这是你真正想要的那些,小心,它可能会有可用性惩罚!)你可以覆盖JTable的preparedRenderer方法:
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component comp = super.prepareRenderer(...);
if (comp instanceof JLabel) {
((JLabel) comp).setHorizontalAlignment(...);
}
return comp;
}
BTW:这种方法违反了不子类JSomething的规则以满足应用程序需求。您可以考虑使用SwingX,它正式支持可视化装饰渲染组件。因此,您可以使用表格注册荧光笔而不是子类:
JXTable table = ...
table.addHighlighter(new AlignmentHighlighter(CENTER), HighlightPredicate.ALWAYS);