gpt4 book ai didi

java - JGoodies FormLayout 拒绝调整我的 JComboBox 大小

转载 作者:行者123 更新时间:2023-12-02 05:20:20 53 4
gpt4 key购买 nike

看起来 JComboBox 是一个非常非常讨厌调整高度的 Java 组件...我尝试了无数 set[Preferred|Minimum|Maximum]Size() 的组合 和各种不同的布局管理器,直到以下 GroupLayout 代码最终起作用:

JComboBox cmbCategories = new JComboBox(new String[] { "Category 1", "Category 2" });
...
layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(cmbCategories, GroupLayout.PREFERRED_SIZE, 100, GroupLayout.PREFERRED_SIZE)
...
layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(cmbCategories, GroupLayout.PREFERRED_SIZE, 40, GroupLayout.PREFERRED_SIZE)

但我现在已经切换到 JGoodies FormLayout ,它再次拒绝调整该死的组合框的大小!我目前有以下代码:

JPanel contentPane = new JPanel();
contentPane.setLayout(new FormLayout("50dlu, $lcgap, 110dlu, $glue, " +
"default, 1dlu, 45dlu, 1dlu, 45dlu", "2*(default, 0dlu), default, " +
"$lgap, fill:30dlu, $lgap, default:grow"));
...
contentPane.add(cmbPanel, CC.xy(1, 7, CC.FILL, CC.FILL));

它在 JFormDesigner 编辑器中显示我想要的内容,但是在运行该程序时,它只是被设置回默认值!

那么我需要想出什么样的魔法才能让它发挥作用呢?!我真的不想在 GroupLayout 中重新定义所有内容,但在尝试调整该死的组合框大小 5 个小时后,我已经处于秃头的边缘!

MTIA 向任何可以提供帮助的人:)

最佳答案

首先,我们必须避免在组件中设置硬编码大小,因为 Swing 设计为与 Layout Managers 一起使用。我们的应用程序必须能够在不同的平台、不同的屏幕分辨率、不同的PLaF中执行的和不同的字体大小。组件的大小和定位是布局管理者的责任,而不是开发人员的责任。

现在,一般来说,当我们想要为 Swing 组件设置首选大小时,我们不使用任何 setXxxSize() 方法,而是重写 getPreferredSize()方法替代:

JComboBox comboBox = new JComboBox() {
@Override
public Dimension getPreferredSize() {
return isPreferredSizeSet() ?
super.getPreferredSize() : new Dimension(100, 40);
}
};

但是,这样做不会影响弹出窗口可见时列出的项目的大小:单元格仍然具有由combo box cell renderer确定的首选大小。 。因此,为了避免这种不良行为,更好的解决方案是:

例如:

JComboBox comboBox = new JComboBox();
comboBox.setPrototypeDisplayValue("This is a cell's prototype text");
comboBox.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
int width = c.getPreferredSize().width; // let the preferred width based on prototype value
int height = 40;
c.setPreferredSize(new Dimension(width, height));
return c;
}
});

我想再次强调,这是一种调整组合框大小的狡猾/肮脏的方式。恕我直言,最好不要弄乱组合框的高度,而只需使用 setPrototypeDisplayValue(...) 以 PLaF 安全的方式设置首选宽度。

关于java - JGoodies FormLayout 拒绝调整我的 JComboBox 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26565271/

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