2013-02-21 35 views
0

好了,我已经得到了我在其中添加了一个JComboBox,到特定的细胞,因为它们中的示例here已经做了一个表的设置,但由于某种原因组合框将不会显示,直到该单元格被选中。如果我选择该单元格,组合框将打开它的列表供我选择。无论是否更改选择,如果我单击表格中的另一个单元格,它会显示从组合框中选择的项目的文本,就像它是根据需要显示在表格中的简单字符串一样。的Java的JComboBox在表中未显示之前细胞点击

我的问题是:我如何得到它,而不必首先选择单元格中显示JComboBox的选定值?

编辑:我忘了提的一件事是;而不是像他们那样宣布DefaultTableModel data在前,而是稍后使用model.addRow();

+1

所以你修改了工作代码,现在它不工作。也许问题是修改后的代码?既然你没有发布你的[SSCCE](http://sscce.org/),我们无法猜测你可能做了什么。 – camickr 2013-02-21 22:55:25

+0

嗯,我想编辑很简单,它不会很难弄清楚...我基本上改变了'DefaultTableModel模型=新的DefaultTableModel(数据,columnNames);'到'DefaultTableModel模型=新的DefaultTableModel(columnNames); '然后做了'model.addRow();'在创建表之后将项目放入表格中。我不会想象它与以后用不同数据更新它们的方式创建表格的方式有很大的不同。 – DGolberg 2013-02-21 23:20:28

+0

这也不例外。使用addRow()方法更新模型并不重要。 – camickr 2013-02-22 01:22:06

回答

1

您可以尝试创建自己的渲染在this例子。

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; 
    } 
} 

,或者你可以自定义的默认渲染就像this例子。

final JComboBox combo = new JComboBox(items); 
TableColumn col = table.getColumnModel().getColumn(ITEM_COL); 
col.setCellRenderer(new DefaultTableCellRenderer(){ 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
           boolean isSelected, boolean hasFocus, int row, int column) { 
     JLabel label = (JLabel) super.getTableCellRendererComponent(table, 
            value, isSelected, hasFocus, row, column); 
     label.setIcon(UIManager.getIcon("Table.descendingSortIcon")); 
     return label; 
    } 
    }); 

第一个示例使单元看起来像点击后的JComboBox。第二个示例向JComboCox添加一个箭头图标,以显示JComboBox是可点击的。我用第二个例子,结果可以看到here

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – 2014-11-07 10:26:14

+0

添加链接的重要部分。 – Adalars1 2014-11-07 14:03:45

+0

自从我问这个问题到现在已经很久了,我忘记了我将要使用它的原因(我相信我最终会采用另一种方法),但您的第二个选择至少可以提供适当的工作 - 显示该字段与其他字段不同,因此您可以在点击该字段时看到不同的响应。谢谢! – DGolberg 2014-11-07 20:03:08

2

将这些项目添加到DTM中,这是正常行为。一张表使用渲染器和编辑器。单元格的默认渲染器只是一个JLabel,所以你看到的只是文本。当你点击单元格时,编辑器被调用,所以你看到组合框。

如果你想在单元格的样子,即使没有被修改,那么你需要创建该列组合框渲染组合框。

阅读从Using Custom Renderers Swing的教程部分获取更多信息。

+0

我想我错误地表达了它......把它看作一个字符串很好,实际上是想要的,但我甚至都没有看到,直到我选择了单元格然后切换到另一个单元格。直到那时,该单元格才显示为空白。 – DGolberg 2013-02-21 22:40:08

+0

嗯,我只是想到一个解决方法,但它似乎有点奇怪的做法...无论如何,当我更新表(获取数据/新数据显示在它),我只是设置值显示组合框的选定项目:'projDTM.setValueAt(cbItems.getSelectedItem(),z,1);'有没有更好的方法来做到这一点,或者这是预期的方法? – DGolberg 2013-02-21 22:53:21

+0

有没有必要“解决”。 – camickr 2013-02-22 01:22:21