2013-06-05 80 views
0

我正在爲一個項目使用AbstractTableModel製作一個自定義的TableModel,我需要找出一種方法來在某些行上顯示一個複選框,但不是其他的。我已經實現了一個getColumn方法,但我希望能夠不顯示一個複選框,除非另一列中的某個條件已達到(例如,如果由特定行表示的對象是燈泡而不是,比方說,烤麪包機,給用戶一個複選框打開或關閉燈)。Java中的TableModel:如何爲不同的行指定不同的渲染器?

我試過使用getValueAt和傳遞null或字符串而不是布爾對象的希望,也許Swing不會呈現複選框。它並沒有,但它也拋出了一組討厭的ClassCastExceptions試圖將一個字符串強制轉換爲布爾值。

有沒有人對我如何做這樣的事情有任何想法?

+0

參見示出的方法(這裏)(http://stackoverflow.com/q/7690614/230513)。 – trashgod

+0

這看起來相當不錯,謝謝@trashgod!如果Jens的解決方案證明實施起來太複雜,我會試試這個。 – nameless912

回答

1

使用單元格渲染器顯示Swing JTable中的列。您應該在Java教程中閱讀How to Use Tables,其中有一節介紹機制如何工作。這是一個自定義單元格渲染器的核心方法的樣子:

public Component getTableCellRendererComponent(JTable table, Object color, 
         boolean isSelected, boolean hasFocus, 
         int row, int column) { 

這種方法的任務是選擇和準備Component(通過設置所需的顏色,字體,圖片...)爲特定的行並且該框架將使用其上的Graphics上下文。有一個DefaultTableCellRenderer可以做竅門,沒有太多的自定義代碼(請參閱教程)。請注意,這種渲染機制是Swing開發人員選擇的一種優化。

您還可以在Swing Hacks中瞭解到很多關於定製Swing組件的信息。這些例子並不是特別精心設計的代碼,只是展示瞭如何創造性地使用Swing API。

祝你好運!

實施例(見註釋):

final JTable orderTable = new JTable(dataModel); 
    // All columns with class Boolean are renderered with MyFancyItemRenderer 
    orderTable.setDefaultRenderer(Boolean.class, new MyFancyItemRenderer()); 

    // Setting the cell renderers explicitly for each column 
    final TableColumnModel columnModel = orderTable.getColumnModel(); 

    final TableColumn itemCountColumn = columnModel.getColumn(ITEM_COUNT); 
    itemCountColumn.setCellRenderer(new MyFancyItemRenderer()); 

    // ... 

    final TableColumn sumColumn = columnModel.getColumn(SUM); 
    sumColumn.setCellRenderer(new MyFancyPriceRenderer()); 
+0

好吧,我覺得這很有道理。所以我可以在我的表模型中使用這個方法來指定單個單元格的樣子,並且我可以返回,例如複選框或空組件,並獲得我正在尋找的內容? – nameless912

+0

在您的自定義單元格渲染器中,您將檢查當前單元格索引是否是您想要執行的操作,即在單元格呈現「組件」或空JLabel時提供「JCheckBox」。我傾向於爲每個自定義列編寫一個簡單但分開的單元格渲染安裝。 一點背景:表模型只提供數據並管理數據的修改(插入,更新,刪除)。很顯然:-) MVC(模型 - 視圖 - 控制器)中的「M」。 JTable和支持類是視圖和控制器(V和C),它們決定數據的外觀。 –

+0

隨意問你是否完成了教程 - 我愛鞦韆:-) –

相關問題