使用 JTable TableCellRenderers 时有一个常见方法,用于在选择单元格时设置背景和前景。以下是提出的一个示例问题:
Why does my Java custom cell renderer not show highlighting when the row/cell is selected?
这个解决方案缺少一件事......单元格周围的边框。 (请注意,我并不是像询问 here 那样询问行周围的边框。)选择单元格时,边框应突出显示。仅创建自己的边框并设置它是 Not Acceptable ,因为您创建的边框可能不适合外观和感觉。
我通过初始化默认渲染器成功获取了边框,然后清除它的边框,如下所示:
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;
}
有更好的方法吗?
最佳答案
您也许可以使用 UIManager。请参阅UIManager Defaults 。 “Table.focusCellHighlightBorder”似乎是您想要的属性。
由原始海报添加:
这是我根据 camickr 的信息提出的解决方案。欢迎优化/清理。
设置静态边框,以便在您需要的任何地方都可以使用它们(我将它们放在名为“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); }
渲染器
@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; }
关于java - 如何在 JTable 渲染器上获得完全突出显示(带边框),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216014/