1

我有一个有点简单的 GUI,我正在尝试为窗口左侧创建按钮和控件。右侧有一个文本区域,最终将显示内容。左侧包含供用户操作的按钮和控件。我使用了一组布局管理器(它们似乎相当挑剔)来制作我现在拥有的东西。

我查看了有关 BoxLayout 的 Oracle 文档,这是左侧控件的容器正在使用的内容,但我没有看到在调整窗口大小时防止按钮分开的方法。我希望它们在顶部被砸碎,然后呆在那里而不留空隙。BoxLayout 的“胶水”功能并没有真正做到你想的那样,它可能应该被称为橡皮筋。

我的问题是,当屏幕调整大小时,如何防止左侧的内容越来越宽?

我的图形用户界面:

public class TestCode extends JFrame{

JTextArea textArea = new JTextArea ();
JComboBox <String> typeComboBox;
JTextField searchField;
JTextField fileField;

public TestCode() {
    System.out.println ("In constructor");
    setTitle ("GUI Test");
    setSize (600, 300);
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    setVisible (true);

    JScrollPane scrollPane = new JScrollPane(textArea);
    add(scrollPane, BorderLayout.CENTER);

    JButton readButton = new JButton("Read File");
    JButton displayButton = new JButton("Display");
    JButton searchButton = new JButton("Search");


    searchField = new JTextField(10);
    fileField = new JTextField(15);

    typeComboBox = new JComboBox <String> ();
    typeComboBox.addItem("Index");
    typeComboBox.addItem("Type");
    typeComboBox.addItem("Name");

    JPanel container = new JPanel();
        container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
    JPanel filePanel = new JPanel();
        filePanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        filePanel.add(new JLabel("Source file:", SwingConstants.RIGHT));
        filePanel.add(fileField);
        filePanel.add(readButton);
    JPanel displayPanel = new JPanel();
        displayPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        displayPanel.add(new JLabel("Display data:", SwingConstants.RIGHT));
        displayPanel.add(displayButton);
    JPanel searchPanel = new JPanel(); 
        searchPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        searchPanel.add(new JLabel ("Search target"));
        searchPanel.add(Box.createHorizontalBox());
        searchPanel.add(searchField);
        searchPanel.add(typeComboBox);
        searchPanel.add(Box.createHorizontalBox());
        searchPanel.add(searchButton);

    container.add(filePanel);
    container.add(displayPanel);
    container.add(searchPanel);
    add(container, BorderLayout.WEST);

    validate();
}
4

3 回答 3

1

如果您固定使用 Box Layout,那么您可以使用Box.Filler创建一个空白区域并将其添加到您的左侧容器中。在Custom Box.Filler标题下查看 oracle 的文档。在您的代码中,在添加 filePanel、displayPanel、searchPanel 后,添加一个首选大小的填充物,该大小大于您支持的分辨率。下面是添加了填充符的代码,以便在调整大小时内容间距保持不变。

另一方面,您可以使用 Mig 布局并使用“包装”来实现相同的行为,而无需特殊的填充物或胶水。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.*;

public class TestCode extends JFrame{

    JTextArea textArea = new JTextArea ();
    JComboBox typeComboBox;
    JTextField searchField;
    JTextField fileField;

public TestCode() {
    System.out.println ("In constructor");
    setTitle ("GUI Test");
    setSize (600, 300);
    setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    setVisible (true);

    JScrollPane scrollPane = new JScrollPane(textArea);
    add(scrollPane, BorderLayout.CENTER);

    JButton readButton = new JButton("Read File");
    JButton displayButton = new JButton("Display");
    JButton searchButton = new JButton("Search");


    searchField = new JTextField(10);
    fileField = new JTextField(15);

    typeComboBox = new JComboBox();
    typeComboBox.addItem("Index");
    typeComboBox.addItem("Type");
    typeComboBox.addItem("Name");

    JPanel container = new JPanel();
        container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
    JPanel filePanel = new JPanel();
        filePanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        filePanel.add(new JLabel("Source file:", SwingConstants.RIGHT));
        filePanel.add(fileField);
        filePanel.add(readButton);
    JPanel displayPanel = new JPanel();
        displayPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        displayPanel.add(new JLabel("Display data:", SwingConstants.RIGHT));
        displayPanel.add(displayButton);
    JPanel searchPanel = new JPanel(); 
        searchPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        searchPanel.add(new JLabel ("Search target"));
        searchPanel.add(Box.createHorizontalBox());
        searchPanel.add(searchField);
        searchPanel.add(typeComboBox);
        searchPanel.add(Box.createHorizontalBox());
        searchPanel.add(searchButton);

        container.add(filePanel);
        container.add(displayPanel);
        container.add(searchPanel);
        container.add(new Box.Filler(new Dimension(0,100), new Dimension(0,1000), new Dimension(0,1000)));
        add(container, BorderLayout.WEST);

    validate();
    }

    public static void main(String[] args) {
        TestCode code = new TestCode();
        code.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        code.setVisible(true);
    }
}
于 2013-08-26T11:41:53.790 回答
1

BoxLayout 使用preferredSize 以及最小和最大尺寸来布局。在您的情况下,随着可用空间的增加,面板将从首选尺寸增长到最大尺寸。为防止这种情况发生,您可以执行以下操作:

filePanel.setMaximumSize( filePanel.getPreferredSize() );
...
displayPanel.setMaximumSize( displayPanel.getPreferredSize() );
...
searchPanel.setMaximumSize( searchPanel.getPreferredSize() );

虽然更好的解决方案是覆盖getMaximumSize()每个面板的 return getPreferredSize()。您现在永远不会在不同的 LAF 中使用您的应用程序,在这种情况下,每个面板的首选大小可能会发生变化。

于 2013-08-26T15:08:06.850 回答
1

Camickrs 的解决方案是可行的方法。为了减少空间,您可以增强它并在将所有组件添加到面板后使用面板/框组件的流:

Stream.of(panel.getComponents()).forEach(component -> component.setMaximumSize(component.getPreferredSize()))
于 2020-06-30T17:27:26.760 回答