【问题标题】:JComboBox showing only if it has a single itemJComboBox 仅在它具有单个项目时显示
【发布时间】:2019-12-15 10:24:24
【问题描述】:

我有一个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);
}

【问题讨论】:

    标签: java swing jpanel jcombobox cardlayout


    【解决方案1】:

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

    p.add(intervalComboBox);
    

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

    但如果我用多个填充它就不会显示。

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

    更好的解决方案是不要将组合框添加到 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 );
    

    然后您只需根据需要将子面板添加到“卡片”面板。

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

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      相关资源
      最近更新 更多