3

JComboBox组件放入GroupLayout. 我已将代码简化为以下最小示例,其中包含一个JComboBoxGroupLayout.

观察到的行为如下:

  • 当框架小于展开的组合框列表(带有虚拟条目 a、b、c)时,单击组合框上的小向下箭头会正确打开它。
  • 当我将框架的大小调整为大于展开的组合框列表时,展开的组合框列表不会打开!

我已经发现了什么:

  • 当 JComboBox 的父窗口太小时,javax.swing.PopupFactory 会创建一个 HEAVY_WEIGHT_POPUP 组件。
  • 当父窗口足够大时,会创建一个 LIGHT_WEIGHT_POPUP。
  • 该行为肯定与 GroupLayout 或它的一些副作用有关,因为我尝试过的任何其他布局管理器都可以正常工作。
  • 在 GroupLayout 中使用 addGap() 时,问题发生了一些变化,即 JComboBox 未显示的窗口大小发生了变化。

这是示例代码 - 欢迎评论:

import java.awt.BorderLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JRootPane;

public class DummyUI_cbdiagnosis extends javax.swing.JPanel {
    private javax.swing.JComboBox cbCategory;

    public DummyUI_cbdiagnosis() {
        initComponents();
    }

    private void initComponents() {
        cbCategory = new JComboBox();
        cbCategory.setModel(new javax.swing.DefaultComboBoxModel(new String[] {
                "a", "b", "c" }));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(
                javax.swing.GroupLayout.Alignment.LEADING).addGroup(
                layout.createSequentialGroup().addComponent(cbCategory,
                        javax.swing.GroupLayout.PREFERRED_SIZE,
                        javax.swing.GroupLayout.PREFERRED_SIZE,
                        javax.swing.GroupLayout.PREFERRED_SIZE)));
        layout.setVerticalGroup(layout.createParallelGroup(
                javax.swing.GroupLayout.Alignment.LEADING).addGroup(
                layout.createSequentialGroup().addComponent(cbCategory)
        ));
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JRootPane rootPane = frame.getRootPane();
        rootPane.setLayout(new BorderLayout());

        DummyUI_cbdiagnosis panel = new DummyUI_cbdiagnosis();
        rootPane.add(panel, BorderLayout.NORTH);

        frame.pack();
        frame.setVisible(true);
    }
}
4

1 回答 1

6

永远不要将组件添加到RootPane自身,而是将它们添加到contentPane.

frame.add(panel);

或者

frame.setContentPane(panel);

ARootPane可以控制放置以下内容的位置:

  • 菜单栏。
  • 内容。
  • 玻璃板。
  • 最重要的是,轻量级弹出窗口(包括JComboBox)、对话框、拖放等。

RootPane使用名为 的特殊布局管理器RootLayout,不应更改为BorderLayout.

于 2012-11-16T17:06:38.350 回答