JComboBox 仅当它有一个项目时才显示

JComboBox showing only if it has a single item

我有一个 JPanel,里面有一个 CardLayout 和一个 JComboBox。它们充满了从 JTable 中获取的数据。如果 JComboBox 只有一个项目,它显示得很好,但如果我用多个项目填充它,它就不会显示。

JPanel intervalPanel = new JPanel;
CardLayout intervalLayout = new CardLayout();
intervalPanel.setLayout(intervalLayout);
JComboBox intervalComboBox = new JComboBox();
for (int i = 0; i < table.getRowCount(); i++) {
    String name = (String) table.getValueAt(i, 0);
    intervalComboBox.addItem(name);
    JPanel p = new JPanel();
    p.setName(name);
    p.add(intervalComboBox);
    p.add(new JLabel(name));
    intervalPanel.add(p, name);
}

一个 Swing 组件只能有一个父组件。

p.add(intervalComboBox);

上面的语句不断从前一个面板中删除组合框并将其添加到当前面板。

but if I fill it with more than one it doesn't show.

所以它不显示的原因是因为它只在最后一张卡片上可见,但您目前看到的是第一张卡片。

更好的解决方案是不将组合框添加到 CardLayout 中的面板。相反,您的主面板应该使用 BorderLayout。那么基本逻辑是这样的:

JPanel main = new JPanel( new BorderLayout() );

JComboBox comboBox = new JComboBox(...);
main.add(comboBox, BorderLayout.PAGE_START);

JPanel card = new JPanel( intervalLayout );
main.add(card, BorderLayout.CENTER);

frame.add( main );

然后您只需根据需要将子面板添加到 "card" 面板。

阅读 Swing 教程中关于 How to Use CardLayout 的部分,了解使用上述设计概念的完整工作演示。