我有一个无法摆脱的问题。
您知道,我对使用 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 的单元格中”
要将相同的视觉装饰应用于所有渲染组件(如果这就是您真正想要的,请小心,它可能会造成可用性损失!)您可以重写 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;
}
顺便说一句:这种方法违反了“不子类化 JSomething 以满足应用程序需求”的规则。您可以考虑使用 SwingX ,它正式支持视觉装饰渲染组件。因此,您可以在表格中注册荧光笔,而不是子类化:
JXTable table = ...
table.addHighlighter(new AlignmentHighlighter(CENTER), HighlightPredicate.ALWAYS);