4

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

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

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

在此处输入图像描述

如何禁用此大纲?

4

2 回答 2

6

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

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

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() );

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

于 2012-10-29T16:02:45.377 回答
0

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

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

jTable1.setFocusable(false);

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

不可聚焦的细胞

无论您在整行下单击的哪一列都被选中,但您单击的单元格未获得焦点。我希望它有帮助!:)

于 2017-07-24T21:29:10.743 回答