当前位置: 首页 > 知识库问答 >
问题:

单击单元格之前,表中的Java JComboBox不显示

颜奇希
2023-03-14

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

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

编辑:我忘记提到的一件事是;而不是像他们一样在手边之前声明DefaultTableModel数据,而是稍后使用model.addRow()将项目添加到DTM;

共有2个答案

况景龙
2023-03-14

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

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

蒙化
2023-03-14

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

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

有关更多信息,请阅读Swing教程中关于使用定制渲染器的部分。

 类似资料:
  • 问题内容: 我这里有两个div: 有没有办法在这两个div之间分隔空间? 问题答案: 您可以使用属性: HTML: CSS: 还有其他选择吗? 好吧 ,不是真的。 为什么? 属性不适用于元素。 属性不会在单元格的边缘之间创建空间。 属性破坏了能够与其父元素一样高的元素的预期行为。

  • 问题内容: 我正在尝试与fieldset配合使用,但缩放比例不正确。如果我改成,同样的事情也起作用。 我尝试使用Safari和Firefox。 我想念什么吗? 问题答案: 基本上,字段集的默认呈现实际上无法在CSS中表示。结果,浏览器必须以非CSS术语来实现它,这会干扰CSS在该元素上的应用。 几乎所有无法使用纯CSS重新创建的元素都会出现此类问题。

  • 我已经建立了一个显示,一个tabpanel。在这个阶段不显示图表。当我点击一个按钮时,我会建立一个新的图表并将其添加到面板中。但什么也没发生。我必须点击面板才能最终显示图表。 因此,我在包含ChartPanel的TabPanel上添加了一个repaint(),但是没有效果。我是不是漏掉了什么?

  • 问题内容: 在我当前的swing项目中,我有一个JList显示所有活动套接字的窗口,每个单元都有一个JButton关闭该套接字的窗口。但是JButton单元格中的不可点击:不会触发监听器。 我将代码修改为最少,如下所示。 该列表看起来不错,但其中的按钮不可单击。我是错了还是JList不支持JButton被解雇? 问题答案: 尽管您无法获得与普通按钮单击相同的视觉效果,但以下示例似乎可行。也许某个绘

  • 我们刚刚开始实施NatTable,我们非常高兴看到性能的提高。然而,我们在实现特定功能时遇到了困难。 我们想要的是在单元格中有可点击的文本,然后它将引用我们选择并进入视图的表中的一行。基本上,类似于: 通过单击。

  • 问题内容: 我正在尝试创建一个表格,其中每个单元格具有背景颜色,并且它们之间具有空白。但我似乎在执行此操作时遇到了麻烦。 我尝试设置边距,但似乎没有效果。 如果我对填充执行相同的操作,则可以,但是在单元格之间没有间距。 有人可以帮我吗? 问题答案: 使用元素上的属性设置单元格之间的间距。 确保设置为(否则每个单元格之间将有一个单独的边框,而不是每个单元格之间可能会有间隔的单独边框)。