2012-06-27 74 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中的概念。