2012-09-19 37 views
2

我正在構建一個swing應用程序,該應用程序將在左側列出項目,並在右側列出表格。顯示在右側的表格數量取決於左側選擇了哪個項目。我希望能夠「突出顯示」(setBackground)所有正在顯示的表中相同的行。比較兩個或多個JTable和'突出顯示'的區別

我讀過關於覆蓋prepareRenderer或getTableCellRendererComponent。然後,條件渲染邏輯在Overridden方法中。

DefaultTableCellRenderer getTableCellRendererComponent never gets called http://tips4java.wordpress.com/2010/01/24/table-row-rendering/ http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer

但是,從我可以告訴什麼,我知道(請糾正我,如果我錯了)這兩個選項可以讓你在同一時間內,這個比較兩個不同的JTable中的能力重寫的方法。 prepareRenderer在擴展JTable的類中被重寫,因此它在特定的表上被實例化。重寫的方法隻影響Table的特定實例。

public class CustomRenderer extends JTable { 
@Override 
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
    Component c = super.prepareRenderer(renderer, row, column); 
    // add custom rendering here 
    return c; 
}}; 

... 
CustomRenderer currTable = new CustomRenderer(); 

getTableCellRendererComponent通過從特定的JTable的columnModel一個特定列的setCellRenderer設置。

public class CustomRenderer extends DefaultTableCellRenderer { 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     if (isSelected) { 
      l.setBackground(Color.gray); 
     } 
     else { 
      l.setBackground(Color.white); 
     } 
    return l; 
    }}; 

... 
CustomRenderer cr = new CustomRenderer(); 
currTable.getcolumnModel().getColumn(1).setCellRenderer(cr); 

那麼接下來我將如何做這樣的事情

if(tableOne.getValueAt(1, 1).equals(tableTwo.getValueAt(1, 1) 
//set Cell 1,1 background(Color.blue) 
else 
//set Cell 1,1 background(Color.red) 

現在我有一個使用多個表格單元格選擇與測試isSelected boolean值,並相應更改背景getTableCellRendererComponent方法的真正醜陋的黑客。這對於現在來說已經足夠好了(因爲我是唯一使用這個程序的人),但是必須有更好的方法能夠根據不同表的條件或值同時比較和更改一個表的渲染。

或者我可以解決問題嗎?

預先感謝閱讀/回覆

回答

3

使用SwingX基礎設施,它是那麼容易,因爲

  • 實現它決定一個非單元是否應突出一個HighlightPredicate
  • 實例化熒光筆(通過設置背景色進行裝飾的熒光筆)並將其添加到兩個表
  • 實現/註冊的一些聽衆這設定謂詞到熒光筆,取決於狀態

下面是使用與所選擇的項目構成的EqualsHighlightPredicate列表中的高亮顯示具有相同內容的所有細胞中的短段。請享用!

final JXList list = new JXList(AncientSwingTeam.createNamedColorListModel()); 
JXTable table = new JXTable(new AncientSwingTeam()); 
final ColorHighlighter highlighter = new ColorHighlighter(
     HighlightPredicate.NEVER, Color.YELLOW, null); 
list.addHighlighter(highlighter); 
table.addHighlighter(highlighter); 
ListSelectionListener l = new ListSelectionListener() { 

    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     if (e.getValueIsAdjusting()) return; 
     highlighter.setHighlightPredicate(
       createPredicate(list.getSelectedValue())); 
    } 

    private HighlightPredicate createPredicate(Object selectedValue) { 
     if (selectedValue == null) return HighlightPredicate.NEVER; 
     return new HighlightPredicate.EqualsHighlightPredicate(selectedValue); 
    } 
}; 
list.getSelectionModel().addListSelectionListener(l); 
+0

在其他答案中,我最喜歡這個。這花了一段時間,但我終於想出瞭如何讓表格比較工作來突出顯示。我必須說JXTable的文檔很少,但它似乎運行良好。謝謝 –

4

我讀過有關重寫prepareRenderer或getTableCellRendererComponent。然後,條件渲染邏輯在Overridden方法中。但是從我能說的和我理解的內容(如果我錯了,請糾正我)這兩種選項都不允許您在此重寫的方法中同時比較兩個不同的JTable。

你爲什麼這麼說,你有什麼數據要備份這個聲明,因爲它是錯誤的。

prepareRenderer延伸的JTable

的方法不能擴展類,所以這沒有意義。

所以它的覆蓋方法只能訪問JTable和getTableCellRendererComponent通過從特定的JTable的columnModel特定列的setCellRenderer設定的特定實例。

方法可以訪問任何程序員讓他們訪問的內容。關鍵在於通過參考。

+0

我已經添加了示例代碼,一些源代碼和改寫的部分。我知道prepareRenderer並沒有明確地擴展JTable,但是擴展了JTable的類包含了重寫的方法。你也可以澄清在第一個報價塊是什麼錯,爲什麼?謝謝 –

3

我可能會使用某種「高亮模型」,它能夠確定哪些表應該突出顯示哪些表(以及如何)。

然後,您可以直接將其提供給單元格渲染器,也可以直接在單元格渲染器中從表格中提取它(但這種方式假定表格的類型正確並打開一整罐蠕蟲)。

所以基本上你最後可能會喜歡的東西......

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    // Seed the component with the default values 
    super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    // You may need to change the value of the component to reflect what 
    // you want to display here 

    // It should be noted, that this method will override the selection 
    // highlighting, you may want to check isSelected and make 
    // your own decisions over what needs to be done. 
    HighlightModel model = getHighlightModel(); 
    // You should check for null 
    Color color = model.getHighlightBackgroundFor(table, row); 
    if (color != null) { 
     setOpaque(true); 
     setBackground(color); 
    } 

    return this; // Assuming you've used a component as a base renderer ;) 

} 
+0

這是一個「HighlightModel」,還是這將是一個TableModel與額外的邏輯,以便檢查高亮顏色?只是好奇 – Panky

+1

嗯,這取決於你。我可能會從一個接口定義被調用的方法,然後執行並不重要 – MadProgrammer

+0

這很有道理。經常發現自己實現了某種TableModel,所以與最新的JTable相關的東西看起來就像是我最近的那種。 – Panky

相關問題