单击单元格前未显示表中的Java JComboBox

单击单元格前未显示表中的Java JComboBox,java,swing,jtable,jcombobox,Java,Swing,Jtable,Jcombobox,好的,我有一个表设置,在其中我向一个特定的单元格添加了一个JComboBox,就像他们在示例中所做的那样,但是由于某种原因,组合框在选中该单元格之前不会显示。如果我选择了那个单元格,组合框会打开它的列表供我选择。无论是否更改选择,如果单击表格中的另一个单元格,它都会显示从组合框中选择的项目的文本,就像它是表格中所需的简单字符串一样 我的问题是:如何让它在JComboBox中显示选定的值,而不必先选择单元格 编辑:有一件事我忘了提到的是;不是像以前那样预先声明DefaultTableModel数据

好的,我有一个表设置,在其中我向一个特定的单元格添加了一个JComboBox,就像他们在示例中所做的那样,但是由于某种原因,组合框在选中该单元格之前不会显示。如果我选择了那个单元格,组合框会打开它的列表供我选择。无论是否更改选择,如果单击表格中的另一个单元格,它都会显示从组合框中选择的项目的文本,就像它是表格中所需的简单字符串一样

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


编辑:有一件事我忘了提到的是;不是像以前那样预先声明
DefaultTableModel数据
,而是在以后使用
model.addRow()将项添加到DTM中

这是正常行为。表使用渲染器和编辑器。单元格的默认渲染器只是一个JLabel,因此您所看到的只是文本。单击单元格时,将调用编辑器,以便看到组合框

如果希望单元格在未编辑时看起来像组合框,则需要为该列创建组合框渲染器


有关更多信息,请阅读上的Swing教程部分。

这是正常行为。表使用渲染器和编辑器。单元格的默认渲染器只是一个JLabel,因此您所看到的只是文本。单击单元格时,将调用编辑器,以便看到组合框

如果希望单元格在未编辑时看起来像组合框,则需要为该列创建组合框渲染器


有关详细信息,请阅读上的Swing教程部分。

您可以尝试创建自己的渲染器,如示例所示


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

您可以尝试创建自己的渲染器,如示例所示


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

我想我的措辞不正确。。。将其视为一个字符串是很好的,实际上是需要的,但我甚至没有看到,直到我选择了一个单元格,然后切换到另一个单元格。在那之前,手机一直是空白的。嗯,我只是想到了一个解决办法,但这似乎有点奇怪。。。无论如何,当我更新表时(获取要在其中显示的数据/新数据),我只需在该单元格中设置值以显示组合框的选定项:
projDTM.setValueAt(cbItems.getSelectedItem(),z,1)是否有更好的方法来实现这一点,或者这是预期的方法?我猜我的措辞不正确。。。将其视为一个字符串是很好的,实际上是需要的,但我甚至没有看到,直到我选择了一个单元格,然后切换到另一个单元格。在那之前,手机一直是空白的。嗯,我只是想到了一个解决办法,但这似乎有点奇怪。。。无论如何,当我更新表时(获取要在其中显示的数据/新数据),我只需在该单元格中设置值以显示组合框的选定项:
projDTM.setValueAt(cbItems.getSelectedItem(),z,1)是否有更好的方法来执行此操作,或者这是预期的方法?因此您修改了工作代码,但现在它不工作。也许问题在于修改后的代码?因为你没有发表你的文章,我们无法猜测你可能做了什么。好吧,我觉得编辑很简单,不难理解。。。我基本上改变了
DefaultTableModel=newdefaulttablemodel(数据、列名)
to
DefaultTableModel=新的DefaultTableModel(columnNames)model.addRow()
在创建表后将项目放入表中。我不认为这与创建表的方式有多大不同,之后他们会用不同的数据更新表,这没有什么不同。是否使用addRow()方法更新模型无关紧要,所以您修改了工作代码,但现在它不工作了。也许问题在于修改后的代码?因为你没有发表你的文章,我们无法猜测你可能做了什么。好吧,我觉得编辑很简单,不难理解。。。我基本上改变了
DefaultTableModel=newdefaulttablemodel(数据、列名)
to
DefaultTableModel=新的DefaultTableModel(columnNames)model.addRow()
在创建表后将项目放入表中。我不认为这与创建表的方式有多大不同,之后他们会用不同的数据更新表,这没有什么不同。是否使用addRow()方法更新模型无关紧要。虽然此链接可能会回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生变化,仅链接的答案可能会无效。添加了链接的重要部分。我问这个问题已经很久了,以至于我忘记了我要用它做什么(我相信我最终选择了另一种方法),但是,您的第二个选项至少提供了一个适当的解决方案,表明该字段与其他字段不同,因此您可以在单击它时期待不同的响应。非常感谢。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。添加了链接的重要部分。我很久没有问过这个问题了,以至于我忘记了我将使用它做什么(我相信我在en中使用了另一种方法)
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;
    }
}
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;
    }
    });