【问题标题】:Java/Scala Swing: Make a component fill all available space in a rowJava/Scala Swing:使组件连续填充所有可用空间
【发布时间】:2023-04-11 05:53:01
【问题描述】:

我正在尝试使用 GridBagLayout 创建一个带有 Swing 的布局。

我想在 Button 旁边放置一个 ComboBox,其中 Button 具有恒定大小,并且 ComboBox 填充了行中的所有可用空间:

但是,如果我放大窗口,ComboBox 和 Button 之间会出现空白:

如何布局这个表单,让 ComboBox 填满所有空间,即使调整了窗口大小?

组件的布局代码,在 Scala 中:

layout(button) = new Constraints() {
    gridx = 1
    gridy = 0
    anchor = GridBagPanel.Anchor.LineEnd
}

layout(comboBox) = new Constraints() {
    gridx = 0
    gridy = 0
    fill = GridBagPanel.Fill.Horizontal
}

layout(centerPanel) = new Constraints() {
    gridx = 0
    gridy = 1
    weighty = 1
    weightx = 1
    gridwidth = 2
    fill = GridBagPanel.Fill.Both
}

【问题讨论】:

  • 对 GUI 的该部分使用 BorderLayout。放组合。在CENTERLINE_END 中的按钮。
  • 还考虑使用代码点 8594(向右箭头)作为组合中的文本..
  • 谢谢,这几乎是完美的。当窗口最大化时,组合框和按钮现在居中。我可以让 ComboBox 伸展吗?
  • 啊,忘记在父 GridBagLayout 上设置 Fill.Horizo​​ntal。现在可以使用了。
  • 我认为它是这样的,但由于我不擅长使用 GBL,我认为最好“坚持我所知道的”,以展示顶部面板拉伸以填充可用宽度.很高兴你把事情解决了。 :)

标签: java swing scala layout-manager gridbaglayout


【解决方案1】:

对 GUI 的该部分使用 BorderLayout。放组合。在CENTERLINE_END 中的按钮。

像这样:

import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.border.*;

public class StretchComboLayout {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JPanel ui = new JPanel(new BorderLayout(2, 2));
                ui.setBorder(new EmptyBorder(4, 4, 4, 4));

                JPanel controls = new JPanel(new BorderLayout(2, 2));
                ui.add(controls, BorderLayout.PAGE_START);
                String s = new String(Character.toChars(8594));
                String[] items = {"Choice: right " + s + " arrow"};
                JComboBox cb = new JComboBox(items);
                controls.add(cb, BorderLayout.CENTER);
                controls.add(new JButton("Button"), BorderLayout.LINE_END);

                JSplitPane sp = new JSplitPane(
                        JSplitPane.VERTICAL_SPLIT, 
                        new JTextArea(4,40), 
                        new JTextArea(4,40));

                ui.add(sp, BorderLayout.CENTER);

                JFrame f = new JFrame("Stretch Combo Layout");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setContentPane(ui);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

  • 另见代码编辑,我在这里说明了使用右箭头的代码点的意思。
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多