重写JTable的DefaultTableCellRenderer以使JTable中的所有单元居中

adr*_*ain 3 java swing jtable renderer

我有一个问题,我无法摆脱.

你知道,我对使用JTables相当新,所以答案可能很简单,但我找不到解决方案:/

所以,我有一个使用AbstractTableModel的JTable,它覆盖了

    public Class<?> getColumnClass(int columnIndex_p) 
Run Code Online (Sandbox Code Playgroud)

方法,告诉要显示的每列的类型.其中一个是布尔值.

当我创建一个简单的JTable时,使用

    table_l = new JTable(new MyTableModel());
Run Code Online (Sandbox Code Playgroud)

一切都很好,并使用复选框(开/关)正确显示布尔值.

现在,我想将文本集中在每个单元格上(以后可能会有更多选项).

所以我为每一列定义了一个新的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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我只需将此CellRender的水平对齐设置为:

    cellRenderer_l.setHorizontalAlignment(JLabel.CENTER);
Run Code Online (Sandbox Code Playgroud)

然后我在JTable的每一列上安装这个新的CellRenderer:

    for (int i = 0; i < table_l.getColumnCount(); ++i) {
        table_l.getColumnModel().getColumn(i).setCellRenderer(cellRenderer_l);
    }
Run Code Online (Sandbox Code Playgroud)

但是,使用新的CellRenderer,显示的JTable不再使用我的TableModel的getColumnClass()方法,因此只在布尔值上显示"true/false"字符串.

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

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

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

tra*_*god 5

默认的单元格渲染器已经这样做了类型的值Boolean.class,如图所示这里.如果这还不够,请编辑您的问题以包含展示您遇到的任何问题的sscce.

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

table.setDefaultRenderer(Boolean.class, yourCellRenderer); 
Run Code Online (Sandbox Code Playgroud)

图片