2010-07-15 152 views
3

我有一個使用基於對象矩陣的模型創建的JTable。 對於每一行,我想使用JComboBox在特定列(第5個)中放入一些信息。 我曾嘗試以下:JTable單元格中的JComboBox

for(int i=0; i < n ; i++) { 
    ..... 
    data[i][5] = new JComboBox(aux); // aux is a Vector of elements I wanna insert 
} 
table.setModel(new MyTableModel()); // MyTableModel() already takes into consideration the data[][] object 

的問題是,數據[I] [5] =新的JComboBox(AUX);不會在JTable的特定單元中創建JComboBox對象,但會將代碼粘貼到行中。 我能做些什麼來解決這個問題?

謝謝。

回答

1

呵呵,它不會像你提出的那樣使用。

您必須創建一個自定義的TableCellRenderer或TableCellEditor。 然後你可以指定哪些類將使用它:

JTable.setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer) 
JTable.setDefaultEditor(Class<?> columnClass, TableCellEditor editor) 

的詳細說明可以在這裏找到:http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/components/table.html#combobox

對於特定行&列定製呈現,你可以簡單地使用:

final int specialRow = 1; 
final int specialColumn = 5; 

JTable table = new JTable(myModel) { 
    private TableCellEditor mySpecialCellEditor = new SpecialCellEditor(...); 

    public TableCellEditor getCellEditor(int row, int column) { 
     int modelColumn = convertColumnIndexToModel(column); 
     int modelRow = convertRowIndexToModel(row); 
     if (modelColumn == specialColumn && row == specialRow) { 
     return mySpecialCellEditor; 
     } else { 
     return super.getCellEditor(row, column); 
     } 
    } 
}; 
+0

謝謝 我一直在分析所有這些例子中你張貼和其他人,在互聯網上..但他們不適合。 我只需要在JTable的特定位置創建一個JComboBox,比如data [1] [5]。 該框已經創建好了,我只需要將它鏈接到那個地方。 在這些例子中,我看到他們獲得了一個完整的列,並從中創建了一個JComboBox,並且我看不到他們如何引用表中的特定位置,例如row-2,column-5等。 。 謝謝 – 2010-07-15 14:26:03

8

一種方法是重寫getCellEditor()方法以返回適當的編輯器。這裏是一個例子,讓你開始:

import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableComboBoxByRow extends JFrame 
{ 
    List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3); 

    public TableComboBoxByRow() 
    { 
     // Create the editors to be used for each row 

     String[] items1 = { "Red", "Blue", "Green" }; 
     JComboBox comboBox1 = new JComboBox(items1); 
     DefaultCellEditor dce1 = new DefaultCellEditor(comboBox1); 
     editors.add(dce1); 

     String[] items2 = { "Circle", "Square", "Triangle" }; 
     JComboBox comboBox2 = new JComboBox(items2); 
     DefaultCellEditor dce2 = new DefaultCellEditor(comboBox2); 
     editors.add(dce2); 

     String[] items3 = { "Apple", "Orange", "Banana" }; 
     JComboBox comboBox3 = new JComboBox(items3); 
     DefaultCellEditor dce3 = new DefaultCellEditor(comboBox3); 
     editors.add(dce3); 

     // Create the table with default data 

     Object[][] data = 
     { 
      {"Color", "Red"}, 
      {"Shape", "Square"}, 
      {"Fruit", "Banana"}, 
      {"Plain", "Text"} 
     }; 
     String[] columnNames = {"Type","Value"}; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model) 
     { 
      // Determine editor to be used by row 
      public TableCellEditor getCellEditor(int row, int column) 
      { 
       int modelColumn = convertColumnIndexToModel(column); 

       if (modelColumn == 1 && row < 3) 
        return editors.get(row); 
       else 
        return super.getCellEditor(row, column); 
      } 
     }; 
     System.out.println(table.getCellEditor()); 

     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) 
    { 
     TableComboBoxByRow frame = new TableComboBoxByRow(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

編輯:代碼更新爲使用垃圾建議。

+0

非常簡潔。作爲替代方案,考慮'List editors = new ArrayList (3)'。 – trashgod 2010-07-15 15:27:26

+0

是的,我在泛型存在之前編寫了示例代碼。我想我應該更新它是更當前:) – camickr 2010-07-15 18:08:45

+0

反思,'List 編輯=新的ArrayList (3)'可能會更好。更通用的做法是避免'getCellEditor()'中的強制轉換,並允許更改實現。對不起,這個流浪漢仍在學習。 – trashgod 2010-07-16 03:36:00

1

嘗試這樣:

public void example(){ 

     TableColumn tmpColum =table.getColumnModel().getColumn(1); 
     String[] DATA = { "Data 1", "Data 2", "Data 3", "Data 4" }; 
     JComboBox comboBox = new JComboBox(DATA); 

     DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox); 
     tmpColum.setCellEditor(defaultCellEditor); 
     tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox)); 
     table.repaint(); 
    } 


/** 
    Custom class for adding elements in the JComboBox. 
*/ 
class CheckBoxCellRenderer implements TableCellRenderer { 
     JComboBox combo; 
     public CheckBoxCellRenderer(JComboBox comboBox) { 
      this.combo = new JComboBox(); 
      for (int i=0; i<comboBox.getItemCount(); i++){ 
       combo.addItem(comboBox.getItemAt(i)); 
      } 
     } 
     public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      combo.setSelectedItem(value); 
      return combo; 
     } 
    } 
相關問題