在JTable中禁用单元格轮廓

RYN*_*RYN 4 java swing jtable

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

jTable1.setCellSelectionEnabled(false);
jTable1.setColumnSelectionEnabled(false);
jTable1.setRowSelectionAllowed(true);
jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

如何禁用此大纲?

Tac*_*der 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

table.setDefaultRenderer( Object.class, new BorderLessTableCellRenderer() );
Run Code Online (Sandbox Code Playgroud)

或者,对于字符串:

table.setDefaultRenderer( String.class, new BorderLessTableCellRenderer() );
Run Code Online (Sandbox Code Playgroud)

这是一个黑客,它只是重复使用原始渲染器并假装聚焦/选定的单元格不是,但它应该让你开始.