我有一个简单的GUI,我正在尝试为窗口的左侧创建按钮和控件。右侧有一个文本区域,最终将显示内容。左侧包含用户操作的按钮和控件。我已经使用了一系列布局管理器(而且它们看起来相当挑剔)来制作我现在拥有的东西。
我查看了关于BoxLayout的Oracle文档,这是左控件容器正在使用的内容,我没有看到在窗口调整大小时阻止按钮分开的方法。我希望他们能够在顶部被砸碎,然后在没有间隔的情况下呆在那里。 BoxLayout的“胶水”功能并没有真正做到你想象的那样,它应该被称为橡皮筋。
我的问题是,当屏幕调整大小时,如何保持左侧内容的分离范围更广?
我的GUI:
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();
}
答案 0 :(得分:1)
BoxLayout使用preferredSize以及minumimu和最大尺寸来布局。在您的情况下,随着可用空间的增加,面板将从首选尺寸增长到最大尺寸。为了防止这种情况发生,你可以这样做:
filePanel.setMaximumSize( filePanel.getPreferredSize() );
...
displayPanel.setMaximumSize( displayPanel.getPreferredSize() );
...
searchPanel.setMaximumSize( searchPanel.getPreferredSize() );
虽然更好的解决方案是覆盖每个面板的getMaximumSize()
以返回getPreferredSize()
。您现在从未在不同的LAF中使用您的应用程序,在这种情况下,每个面板的首选大小可能会发生变化。
答案 1 :(得分:0)
如果您已修复使用Box Layout,则可以使用 Box.Filler 创建一个空白区域并将其添加到左侧容器中。检查标题自定义Box.Filler 下的oracle文档here。在您的代码中,添加filePanel,displayPanel,searchPanel后,添加一个首选大小超过您支持的分辨率的填充符。下面是添加了填充符的代码,以便在调整大小时内容间距保持不变。
另一方面,您可以使用Mig Layout并使用“wrap”来实现相同的行为,不需要特殊的填充物或胶水。
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);
}
}
答案 2 :(得分:0)
Camickrs的解决方案是解决之道。为了减少空间,您可以对其进行增强,并在将所有组件添加到面板后使用面板/盒子的组件流:
Stream.of(panel.getComponents()).forEach(component -> component.setMaximumSize(component.getPreferredSize()))