Java 无法使swing布局按我所希望的方式工作。
我有一个简单的GUI,我只想让一些文本字段堆叠在一起,每个框都是一个JPanel。我目前正在为JFrame和JPanel使用FlowLayout,但当我最大化时,它会从堆叠变成一行。理想情况下,我希望文本字段保持在窗口的中心,即使其最大化。我正在考虑使用BoxLayout,但在使用上遇到了一些问题Java 无法使swing布局按我所希望的方式工作。,java,swing,user-interface,layout-manager,Java,Swing,User Interface,Layout Manager,我有一个简单的GUI,我只想让一些文本字段堆叠在一起,每个框都是一个JPanel。我目前正在为JFrame和JPanel使用FlowLayout,但当我最大化时,它会从堆叠变成一行。理想情况下,我希望文本字段保持在窗口的中心,即使其最大化。我正在考虑使用BoxLayout,但在使用上遇到了一些问题 public static Component textbox(String x){ JPanel panel = new JPanel(new FlowLayout(5,5,5));
public static Component textbox(String x){
JPanel panel = new JPanel(new FlowLayout(5,5,5));
JLabel lbltAm= new JLabel(x);
JTextField tftAm = new JTextField(10);
lbltAm.setFont(new Font("Serif", Font.PLAIN, 14));
lbltAm.setForeground(Color.white);
panel.add(lbltAm, BorderLayout.NORTH);
panel.add(tftAm, BorderLayout.CENTER);
panel.setBackground(Color.DARK_GRAY);
Border lowerbevel = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
panel.setBorder(lowerbevel);
return panel;
}
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("Tip Calculator");
//Add Textbox
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
String Label = "Tip Calculator";
JLabel header = new JLabel(Label);
header.setFont(new Font("Serif", Font.BOLD, 18));
frame.add(header);
frame.add(textbox("Total"));
frame.add(textbox("Tip %"));
frame.add(textbox("People"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setBackground(Color.gray);
frame.setPreferredSize(new Dimension(300, 400));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
在createAndShowGUI中尝试使用GridLayout而不是BoxLayout
frame.setLayout(new GridLayout(4,1));
首先,我不知道为什么在将面板的布局设置为FlowLayout之后,要使用BorderLayout的方法将组件添加到JPanel 如果您希望始终保持组件居中(即使屏幕最大化),FlowLayout可能不是您使用的最佳选项,因为FlowLayout将继续水平放置组件,直到它们填满框架(一行)的宽度,然后开始下一行。因此,如果屏幕尺寸最大化,则每行将有更多组件,并且不会堆叠。我建议使用GridLayout,其中一列如下:
frame.setLayout(new GridLayout(3 *(number of rows/components)*, 1));
您可以对JPanel执行同样的操作。之后,将每个组件的水平对齐设置为居中,如下所示:
component.setHorizontalAlignment(componentName.CENTER);
希望这有帮助 这是一个意见问题,但为了灵活性,我更喜欢使用
GridBagLayout
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(textbox("Total"), gbc);
add(textbox("Tip %"), gbc);
add(textbox("People"), gbc);
}
public Component textbox(String x) {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.insets = new Insets(5, 5, 5, 5);
JLabel lbltAm = new JLabel(x);
JTextField tftAm = new JTextField(10);
lbltAm.setFont(new Font("Serif", Font.PLAIN, 14));
lbltAm.setForeground(Color.white);
panel.add(lbltAm, gbc);
panel.add(tftAm, gbc);
panel.setBackground(Color.DARK_GRAY);
Border lowerbevel = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
panel.setBorder(lowerbevel);
return panel;
}
}
}
或者,如果您希望“盒子”在扩展时占据整个区域,您可以使用类似
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
add(textbox("Total"), gbc);
add(textbox("Tip %"), gbc);
add(textbox("People"), gbc);
这会导致类似于
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
add(textbox("Total"), gbc);
add(textbox("Tip %"), gbc);
add(textbox("People"), gbc);
请查看,有关更多详细信息,请回答您的问题!哦,是的,就是这么做的。当然,似乎总是一个答案引出另一个答案。好吧,这是一个错误,但其他16个呢?!?好的,第一个例子更像我想要的。感谢这些例子,我对GUI还是很陌生,所以仍然在尝试处理不同的布局。