0

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

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

编辑:我忘记提及的一件事是;而不是DefaultTableModel data像他们那样事先声明,而是稍后使用将项目添加到 DTMmodel.addRow();

4

2 回答 2

2

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

如果您希望单元格看起来像一个组合框,即使它没有被编辑,那么您需要为该列创建一个组合框渲染器。

阅读 Swing 教程中有关使用自定义渲染器的部分以获取更多信息。

于 2013-02-21T22:36:10.263 回答
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;
    }
}

或者您可以像本示例中那样自定义默认渲染器。

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 是可单击的。我用了第二个例子,结果可以在这里看到。

于 2014-11-07T09:54:27.100 回答