Java 禁用JTable中的单元格大纲

Java 禁用JTable中的单元格大纲,java,swing,jtable,Java,Swing,Jtable,我正在使用JTable来显示一些数据。用户只能选择JTable的整行,而不能选择单个单元格。下面是用于仅允许行选择的代码: jTable1.setCellSelectionEnabled(false); jTable1.setColumnSelectionEnabled(false); jTable1.setRowSelectionAllowed(true); jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELEC

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

jTable1.setCellSelectionEnabled(false);
jTable1.setColumnSelectionEnabled(false);
jTable1.setRowSelectionAllowed(true);
jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
但当用户选择一行时,该行中的单元格会被勾勒出来(下图中的第一列/最后一行):


如何禁用此大纲?

您可以简单地扩展
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() );

这是一个小技巧,因为它只是重复使用原始渲染器,并假装聚焦/选定的单元格不是,但它应该让您开始使用。

我刚刚发现一个非常简单的技巧来改变这种行为。事实证明,细胞聚焦是表聚焦的延伸。如果表格不能聚焦在单个单元格上,也不能聚焦在单个单元格上(尽管仍会显示行选择)

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

jTable1.setFocusable(false);
下面是我的一个项目中实现相同行为的图片(注意:我使用的是windows LookAndFeel)


无论您在整行下单击哪个列,都会选中该列,但您单击的单元格不会聚焦。我希望有帮助!:)

有趣的是发布一个SSCCE,也有渲染器