2011-06-02 60 views
1

當選擇單元格時,使用JTable TableCellRenderer設置背景和前景時有一種常見方法。這裏是被問了一個例子問題:如何在JTable渲染器上獲得完整突出顯示(帶邊框)

Why does my Java custom cell renderer not show highlighting when the row/cell is selected?

該解決方案缺乏一件東西的細胞周圍的邊框。 (請注意,我並沒有詢問行周圍的邊框,如問here。)選擇單元格時,邊框應突出顯示。僅僅創建自己的邊框並設置它是不可接受的,因爲您創建的邊框可能不符合Look &感覺。

我已經成功地通過了初始化默認渲染器,然後清除它的邊框,如下邊界:

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; 
} 

有沒有更好的辦法?

+0

請注意,'getBorder()'可能會返回'null'。 – trashgod 2011-06-02 17:03:57

+0

與trashgod一致,現在返回到關於prepareRenderer的camickr示例,以及基本的workAround,更好地獲取Component(錯過)和JComponent,注意:如果不在這裏AWT Component或Custom Painting,然後使用Opacities dosn沒有任何意義,建立prepareRenderer(這已被大多數Custom L&F所接受),如果需要對某些TabelColumn進行som更改,然後添加TableRenderer,則可以將它們組合在一起 – mKorbel 2011-06-02 18:58:18

回答

2

您可能可以使用UIManager。見UIManager Defaults。 「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; 
    } 
    
+0

有趣的是,沒有Table .cellHighlightBorder(沒有焦點)與它一起去。 – Pixel 2011-06-02 20:26:33

+0

@Pixel,我相信它只是一個EmptyBorder,其中的insets設置爲與高光邊框相同的尺寸,所以當邊框從正常變爲高光時,您看不到文字移位。 – camickr 2011-06-03 00:00:05