gpt4 book ai didi

java - JComboBox 不能很好地与 GroupLayout 配合使用

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:50:47 25 4
gpt4 key购买 nike

JComboBox 组件放入 GroupLayout 时,我遇到了一种奇怪的行为。我已将代码缩减为以下最小示例,其中包含一个由 GroupLayout 布局的 JComboBox

观察到的行为如下:

  • 当框架小于展开的组合框列表(带有虚拟条目 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);
}
}

最佳答案

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

frame.add(panel);

frame.setContentPane(panel);

RootPane 可以控制放置:

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

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

关于java - JComboBox 不能很好地与 GroupLayout 配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13421094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com