2011-12-01 79 views
2

我喜歡用複選框和一個或兩個可選文本字段創建單元格。JTable與一個單元格中的多個元素

如果我點擊複選框,文本框會變得可見。我試圖讓一個ASCII畫面應該如何看起來像:

[ ] 
[X] [some string] 
[X] [value1] [value2] 

我知道如何創建一個自定義的渲染,但我不知道如何返回多個元素。如果我有一個複選框渲染我只返回對JCheckBox:

class BooleanRenderer extends JCheckBox implements TableCellRenderer, UIResource 
{ 
    public Component getTableCellRendererComponent(JTable table, Object value, 
          boolean isSelected, boolean hasFocus, int row, int column) { 
     // doing some stuff... 
     return this; 
    } 
} 

回答

4

@Thomas et al。對區分模型視圖是正確的。你的模型包含一個布爾狀態和一些相應的文本;您的觀點是可以切換的JCheckBox以及可以更改的文字。您將需要一個渲染器來顯示模型的當前狀態,還需要一個編輯器來允許更改狀態。

在此example中,類Value保存選定狀態和基礎數據,值爲Double。執行TableModelDataModel管理List<Value>。請注意,編輯器和渲染器都使用通用的java.text.DecimalFormat。相關的類java.text.MessageFormat在編寫複選框的文本時可能很有用。

2

你不得不代表你的表模型結構爲好,即單元格的值應該已經是布爾標誌的複合材料和其他值。

+0

我真的需要這樣做嗎?我可以使用分隔符將所有值存儲在一個單元格中:複選框| textfield1 | textfield2。也許不是很好,但那對我很有用。 – PiTheNumber

+0

@PiTheNumber複選框等是表示,而不是值。因此你不能使用分隔符來存儲它們。當然,您可以使用字符串表示法並在每次需要訪問字段時解析該字符串,但是我會說創建包裝器對象會更容易編寫,理解和維護。 – Thomas

+0

@托馬斯是對的;更多[這裏](http://stackoverflow.com/a/8347512/230513)。 – trashgod

1

你的渲染器類將不得不返回一個你有其他對象的父組件(如uhm說的,可能是一個JPanel)。你的tableModel將不得不保存渲染器使用的值描繪每個組件。例如,模型可以設置爲數據對象列表,並且列表中的每個條目都包含一個布爾值,以指示是否選中了複選框,以及textField數據的String等。您不能使用Table可視化地描繪有用的Swing對象,如果關聯的模型沒有存儲在任何地方。

相關問題