在JTable中禁用单元格轮廓

时间:2012-10-29 15:19:32

标签: java swing jtable

我正在使用JTable来显示一些数据。用户只能选择JTable的整行,而不能选择单个单元格。这是用于仅允许行选择的代码:

jTable1.setCellSelectionEnabled(false);
jTable1.setColumnSelectionEnabled(false);
jTable1.setRowSelectionAllowed(true);
jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

但是当用户选择一行时,该行中的单元格会被勾勒出来(下图中的第一列/最后一行):

enter image description here

如何禁用此大纲?

2 个答案:

答案 0 :(得分:6)

你可以简单地扩展DefaultTableCellRenderer,并从UI的角度假装单元格没有“聚焦”。

我使用以下渲染器删除了边框:

private static class BorderLessTableCellRenderer extends DefaultTableCellRenderer {

    private static final long serialVersionUID = 1L;

    public Component getTableCellRendererComponent(
            final JTable table,
            final Object value,
            final boolean isSelected,
            final boolean hasFocus,
            final int row,
            final int col) {

        final boolean showFocusedCellBorder = false; // change this to see the behavior change

        final Component c = super.getTableCellRendererComponent(
                table,
                value,
                isSelected,
                showFocusedCellBorder && hasFocus, // shall obviously always evaluate to false in this example
                row,
                col
        );
        return c;
    }
}

你可以像这样在你的JTable上设置它:

table.setDefaultRenderer( Object.class, new BorderLessTableCellRenderer() );

或者,对于字符串:

table.setDefaultRenderer( String.class, new BorderLessTableCellRenderer() );

这有点像黑客,因为它只是重复使用原始渲染器并假装聚焦/选定的单元格不是,但它应该让你开始。

答案 1 :(得分:0)

我刚刚发现了一个改变这种行为的简单技巧。事实证明,细胞聚焦是表焦点的延伸。如果表格无法关注单个单元格(尽管行选择仍然显示)。

您只需要一行简单的代码:

jTable1.setFocusable(false);

这是我的一个项目的图片,它实现了同样的行为(注意:我正在使用Windows LookAndFeel)

Non-focusable cells

无论您选择在整行下单击哪一列,但单击的单元格都没有聚焦。我希望它有所帮助! :)