2010-11-08 32 views
3

我有一個JTable,我想使用自定義背景顏色突出顯示某些行。這我已經做了以下類:在具有自定義行背景顏色的JTable中使用intercellSpacing會導致意外的結果

public class MyTable extends JTable { 

    private List<RefData> data = null; 

    public List<RefData> getData() { 
     return data; 
    } 

    public void setData(List<RefData> data) { 
     this.data = data; 
    } 

    @Override 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
     Component comp = super.prepareRenderer(renderer, row, column); 

     if (this.data == null || row < 0 || row > this.data.size()-1){ 
      return comp; 
     } 

     RefData rowData = this.data.get(row); 
     if (rowData.getStatus() < 3000){ 
      comp.setBackground(Color.YELLOW); 
     } else { 
      comp.setBackground(Color.WHITE); 
     } 

     return comp; 
    } 

} 

所有這一切都像一個魅力,我得到我想要的。接下來,在查看生成的GUI時,我意識到表格看起來過於濃縮。一切看起來都在一起。由於始終與默認的JTable設置;)

嗯,這是很容易解決心想:

myTable.setIntercellSpacing(new java.awt.Dimension(10, 1)); 

現在,細胞是很好的間隔,添加單元格邊距現在在默認的表背景顏色,在我的情況下是白色的。這看起來很尷尬。

我假設單元格間距增加了單元邊框和prepareRenderer返回的組件之間的間距。這將解釋結果。但是,我怎樣才能改變細胞本身的背景?我的prepareRenderer解決方案不適合這項任務嗎?還是有另一種解決方案?

回答

1

我現在想出了以下解決方案。對我來說似乎沒問題。但是,有人可以確認這是正確的(或方式)嗎?

public class MyTable extends JTable { 

    // [snip] 

    private Border paddingBorder = BorderFactory.createEmptyBorder(2, 3, 2, 3); 

    // [snip] 

    @Override 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
     Component comp = super.prepareRenderer(renderer, row, column); 

     if (JComponent.class.isInstance(comp)){ 
      ((JComponent)comp).setBorder(paddingBorder); 
     } 

     // [snip] 
    } 

    // [snip] 

} 
+0

由於沒有人在這方面進行了打分,所以我會認爲沒關係。 – exhuma 2011-02-14 12:16:41

3

邊境的做法是正確的,但最好是做到這一點的單元格渲染器,而不是prepareRenderer()方法:

JTable.setDefaultRenderer(Object.class, new DefaultCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      JComponent component = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      component.setBorder(...); 
      return component; 
     } 
    }); 
+0

謝謝。但爲什麼? 'prepareRenderer'和'setDefaultRenderer'有什麼優點/缺點?兩者中的一個會加快用戶界面(少打電話)? – exhuma 2010-11-08 10:42:26

+0

@exhuma:不,兩種方法同樣快。它只是渲染器負責渲染,這是改變單元格繪製方式的默認方式,並且重寫prepareRenderer()方法看起來有點像黑客。 – 2010-11-08 10:52:13

+0

好的。我懂了。我用你的方法來改變行的顏色,但有一個問題。某些列不會更改顏色。數據來自一個bean綁定。我猜他們是'int'。因此,setDefaultRenderer的簽名將不匹配。一個奇怪的現象,因爲我認爲表值始終是對象... – exhuma 2010-11-08 12:34:12

3

可有人請確認這是做的正確方法它在Swing中,請嗎?

重寫prepareRenderer()有適用於所有細胞的優點,而「內部實現始終使用此方法來準備渲染器,以便此默認行爲可以由子類能夠安全地重寫。」即使您以後使用setDefaultRenderer()作爲特定課程,我也沒有發現問題。

附錄:可以在文章Table Row Rendering和與此相關的answer中找到示例。

相關問題