2012-04-04 60 views
6

我想讓我的表格在單擊單元格時選擇整行(可以通過關閉列選擇來完成),但是,我不希望突出顯示您點擊的特定單元格周圍的額外厚邊框。我希望這將是容易的,但顯然它涉及渲染,所以我做了很多的研究,我可以得到最接近的是這樣的:Java - Swing - JTable - 爲選定行設置顏色,但不是單元格

JTable contactTable = new JTable(tableModel); 

    contactTable.setCellSelectionEnabled(true); 
    contactTable.setColumnSelectionAllowed(false); 
    contactTable.setRowSelectionAllowed(false); 
    contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

    // This renderer extends a component. It is used each time a 
    // cell must be displayed. 
    class MyTableCellRenderer extends JLabel implements TableCellRenderer { 
     // This method is called each time a cell in a column 
     // using this renderer needs to be rendered. 
     public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { 
      // 'value' is value contained in the cell located at 
      // (rowIndex, vColIndex) 

      if (isSelected) { 
       // cell (and perhaps other cells) are selected 

      } 

      if (hasFocus) { 
       // this cell is the anchor and the table has the focus 
       this.setBackground(Color.blue); 
       this.setForeground(Color.green); 
      } else { 
       this.setForeground(Color.black); 
      } 

      // Configure the component with the specified value 
      setText(value.toString()); 

      // Set tool tip if desired 
      // setToolTipText((String)value); 

      // Since the renderer is a component, return itself 
      return this; 
     } 

     // The following methods override the defaults for performance reasons 
     public void validate() {} 
     public void revalidate() {} 
     protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {} 
     public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {} 
    } 

    int vColIndex = 0; 
    TableColumn col = contactTable.getColumnModel().getColumn(vColIndex); 
    col.setCellRenderer(new MyTableCellRenderer()); 

我從一個例子複製的渲染,只有改變了hasFocus()函數使用我想要的顏色。在​​中設置顏色什麼也沒做。

這段代碼的問題是:

  1. 它僅適用於在底部由vColIndex指定的一列。很顯然,我希望將其應用於所有列,以便單擊一個單元格可突出顯示整行。我可以做一個for循環將其更改爲每個單元格,但我認爲有一個更好的方法可以一次更改所有列的cellRenderer。

  2. setForegroundColor()可以改變文字,但setBackgroundColor()對單元格背景沒有任何作用。我希望它可以像屬性所暗示的那樣改變背景顏色。

    • #2的解決方案:在分配backgroundcolor之前使用this.setOpaque(true);
  3. 當渲染器確實工作時,它只能在單個單元上工作。我怎樣才能讓它爲行中的所有單元格着色?

    • 解決方案#3:我想通了!如果您啓用行選擇(table.setRowSelectionAllowed(true)),而不是使用hasFocus()(僅影響單個單元格),則將顏色更改爲if(isSelected)語句。然後,整行被認爲是選中的,並將所有的單元格顏色化!

3是大的,但如果有誰知道#1爲什麼它被設計成只能在這將是大加讚賞時渲染器適用於一列能向我解釋。

回答

5

教程文章Concepts: Editors and Renderers解釋,「單一細胞渲染通常用於繪製所有包含相同類型的數據的單元的,」由模型的getColumnClass()方法返回。

或者,覆蓋prepareRenderer(),這是調用所有單元格,以選擇性地更改行的外觀。 example比較了這兩種方法,文章Table Row Rendering擴展了該方法的多功能性。

0

對於第二個問題,您可以嘗試setSelectionBackground(Color)和setSelectionForeGround(Color)方法。我不知道如何解決第一個問題。最後一個建議是你可以使用一些swing designer插件,比如JBuilder。這將有很大幫助。

+0

感謝您的答覆。我試圖使用setSelectionBackground(Color),但Eclipse將其標記爲不存在的方法。 – Daniel 2012-04-04 20:02:58

+0

其實我想到了那部分,我編輯了原文。 – Daniel 2012-04-04 20:13:53

+0

我現在嘗試setSelectionBackGround方法,它的工作原理。當我選擇一行或多行時,其顏色會發生變化。但也許我明白你在找什麼。 – mbaydar 2012-04-04 20:21:42

12

太直接了只是不添加行

tablename.setSelectionBackground(Color.red); 

在我的情況

jtbillItems.setSelectionBackground(Color.red); 
+1

僅當您沒有設置背景顏色的TableCellRenderer時。在這種情況下,你必須添加一個'if(!isSelected){setBackground(color1);}'。 – FaithReaper 2017-05-29 09:04:26