2012-06-27 73 views
2

我試圖將JComboBox放置在JTable的某個列內。 我有這樣的代碼,它工作:JComboBox的Java JTable

model = new DefaultTableModel(); 
    JComboBox<String> optionComboCell = new JComboBox<String>(); 
    optionComboCell.addItem("Option 1"); 
    optionComboCell.addItem("Option 2"); 
    optionComboCell.setSelectedIndex(1); 


    table = new JTable(model); 
    // Adding here all the columns, removed for clarity 
    model.addColumn("Options"); 
    TableColumn optionsColumn = table.getColumn("Options"); 
    optionsColumn.setCellEditor(new DefaultCellEditor(optionComboCell)); 

我的問題,這一點,是直到在列的單元格,選擇它並不顯示爲JComboBox中。 加載JFrame時,整個表看起來都是一樣的,就好像所有單元格中只有文本一樣。 單擊時,它將顯示組合框的箭頭和選項,但再次取消選擇時,它看起來像常規單元格。

任何方法來解決這個問題?

回答

4

是,使用一個JComboBox,渲染你的細胞:

import java.awt.Component; 
import java.util.Enumeration; 
import java.util.Vector; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 

public class Test4 { 

    private static class ComboBoxCellRenderer extends JComboBox implements TableCellRenderer { 

     public ComboBoxCellRenderer(int column) { 
      for (int i = 0; i < 10; i++) { 
       addItem("Cell (" + i + "," + column + ")"); 
      } 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      setSelectedItem(value); 
      return this; 
     } 
    } 

    protected void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.add(getTable()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private Component getTable() { 
     Vector<Vector<String>> data = new Vector<Vector<String>>(); 
     for (int i = 0; i < 10; i++) { 
      Vector<String> row = new Vector<String>(); 
      for (int j = 0; j < 3; j++) { 
       row.add("Cell (" + i + "," + j + ")"); 
      } 
      data.add(row); 
     } 
     Vector<String> columns = new Vector<String>(); 
     columns.add("Column 1"); 
     columns.add("Column 2"); 
     columns.add("Column 3"); 
     DefaultTableModel model = new DefaultTableModel(data, columns); 
     JTable table = new JTable(model); 
     table.setRowHeight(20); 
     int i = 0; 
     Enumeration<TableColumn> c = table.getColumnModel().getColumns(); 
     while (c.hasMoreElements()) { 
      TableColumn column = c.nextElement(); 
      column.setCellRenderer(new ComboBoxCellRenderer(i)); 
      i++; 
     } 
     JScrollPane scroll = new JScrollPane(table); 
     scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     return scroll; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test4().initUI(); 
      } 
     }); 
    } 
} 
+0

它有點作品。我已經使用了ComboBoxCellRenderer類,現在它顯示爲一個組合框,但是,一旦選擇了一個選項,它仍然顯示爲一個空的組合框。只有當下拉列表打開時,所選項目纔可見 –

+0

@Llablabla您必須確保您試圖選擇的項目(在調用getTableCellRendererComponent期間)實際存在於ComboBox模型中,否則它不會工作。 –

+0

謝謝。如何設置默認值?因爲起初,沒有選項顯示爲選中狀態。只有當我選擇一個 –

-1

嘗試設置單元格渲染器。

+0

請兩三句話,您的回答太短,因爲(上週)有***用戶標記短褲或另一個非標準的帖子,可能會被刪除 – mKorbel

4

您需要定義自己的渲染你的桌子上顯示的組件,因爲CellEditors只需要一個TableCell的內編輯值(這就是爲什麼只有當你點擊一個單元格時才起作用)。

也許看看Java Tutorials瞭解更多關於渲染器和編輯器JTable中的概念。