JGoodies FormLayout拒绝调整我的JComboBox大小



似乎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是为与布局管理器一起使用而设计的,我们的应用程序必须能够在不同的平台、不同的屏幕分辨率、不同的PLaF和不同的字体大小中执行。组件的大小和定位是布局经理的责任,而不是开发人员的责任。

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

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

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

  • 使用setPrototypeDisplayValue(…)方法设置首选的宽度
  • 设置一个单元格渲染器,并在getListCellRendererComponent(…)方法实现内设置单元格高度

例如:

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;
    }
});

我想再次强调,这是一种调整组合框大小的方法。IMHO,最好不要打乱组合框的高度,只使用setPrototypeDisplayValue(...)以PLaF安全的方式设置首选宽度。

相关内容

  • 没有找到相关文章

最新更新