3

我有一个无法摆脱的问题。

你知道,我对使用 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() 方法,因此只在布尔值上显示“真/假”字符串。

我不知道如何让它仍然像以前一样使用 getColumnClass() 。

如果有人有答案...谢谢

编辑:感谢您所做的所有澄清。事实上,我真正的问题是:“如何影响 JTable 的所有 DefaultRenderer 以使它们将结果集中在 JTable 的单元格中”

4

2 回答 2

5

默认单元格渲染器已经为 type 的值执行此操作Boolean.class如此处所示。如果这还不够,请编辑您的问题以包含一个sscce,以展示您遇到的任何问题。

附录:如果您需要进一步自定义 a DefaultTableCellRenderer,请使用 指定适用类型的渲染器,setDefaultRenderer()如下所示

table.setDefaultRenderer(Boolean.class, yourCellRenderer); 

图片

于 2013-02-08T10:02:44.743 回答
2

为了对所有渲染组件应用相同的视觉装饰(如果这是您真正想要的,请小心,它可能会降低可用性!)您可以覆盖 JTable 的 prepareRenderer 方法:

@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 。因此,您可以在表中注册一个 Highlighter,而不是子类化:

JXTable table = ...
table.addHighlighter(new AlignmentHighlighter(CENTER), HighlightPredicate.ALWAYS);   
于 2013-02-08T10:59:50.790 回答