1

使用 JTable TableCellRenderers 设置单元格选中时的背景和前景时,有一个常用方法。这是一个被问到的示例问题:

为什么我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示?

该解决方案缺少一件事……单元格周围的边界。(请注意,我不是在询问行周围的边框,正如这里所问的那样。)当单元格被选中时,边框应该突出显示。只创建自己的边框并设置它是不可接受的,因为您创建的边框可能不适合外观。

我已经通过初始化默认渲染器成功获得了边框,然后为它的边框清除它,如下所示:

private final DefaultTableCellRenderer defTblRend = new DefaultTableCellRenderer();
private final JComponent renderer = new ComplexCell(); // Whatever object type extends JComponent
@Override public Component getTableCellRendererComponent(JTable table,
    Object value, boolean isSelected, boolean hasFocus, int row,
    int column)
{
    // ... Set values on "renderer" object here ...
    renderer.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
    renderer.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
    renderer.setOpaque(!renderer.getBackground().equals(table.getBackground()));
    JComponent comp = (JComponent)defTblRend.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    renderer.setBorder(comp.getBorder());
    return renderer;
}

有没有更好的办法?

4

1 回答 1

2

您也许可以使用 UIManager。请参阅UIManager 默认值。“Table.focusCellHighlightBorder”似乎是您想要的属性。

由原始海报添加:

这是我根据 camickr 的信息提出的解决方案。欢迎优化/清理。

  1. 设置静态边框,以便在您需要的任何地方都可以使用它们(我将它们放在一个名为“UiUtils”的类中):

    public static final Border focusedCellBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
    public static final Border unfocusedCellBorder = createEmptyBorder();
    private static Border createEmptyBorder()
    {
        Insets i = focusedCellBorder.getBorderInsets(new JLabel());
        return BorderFactory.createEmptyBorder(i.top, i.left, i.bottom, i.right);
    }
    
  2. 渲染器

    @Override public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column)
    {
        // [... set component values here ...]
        label.setBorder(hasFocus ? UiUtils.focusedCellBorder : UiUtils.unfocusedCellBorder);
        return label;
    }
    
于 2011-06-02T19:15:28.857 回答