Java 如何在Spring中将一组组件与Swing布局管理器居中对齐
我试图在Swing中创建一个表单 表单应类似于以下内容:Java 如何在Spring中将一组组件与Swing布局管理器居中对齐,java,swing,layout-manager,springlayout,Java,Swing,Layout Manager,Springlayout,我试图在Swing中创建一个表单 表单应类似于以下内容: ____________________________________ |___________________________________X| | | | ________________ | | label1 [________________] | | ____________
____________________________________
|___________________________________X|
| |
| ________________ |
| label1 [________________] |
| ________________ |
| label2 [________________] |
| |
| |
| [Save] [Close] |
|____________________________________|
但我无法将文本字段垂直居中对齐
以下是打开框架的代码:
public class Main {
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
LayoutTest test = new LayoutTest();
test.setVisible(true);
}
});
}
}
以下是初始化字段和创建布局的代码:
public class LayoutTest {
private JFrame testFrame;
JLabel label1;
JTextField field1;
JLabel label2;
JTextField field2;
JButton saveButton;
JButton closeButton;
public LayoutTest() {
testFrame = new JFrame();
initProperties();
initContent();
initLayout();
}
private void initProperties() {
testFrame.setTitle("Test");
testFrame.setSize(1000, 800);
testFrame.setLocationRelativeTo(null);
testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
private void initContent() {
label1= new JLabel("Label 1");
field1= new JTextField(25);
label1.setLabelFor(field1);
label2= new JLabel("Label 2");
field2= new JTextField(25);
label2.setLabelFor(field2);
saveButton = new JButton("Save");
closeButton = new JButton("Close");
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
testFrame.add(label1);
testFrame.add(field1);
testFrame.add(label2);
testFrame.add(field2);
testFrame.add(saveButton);
testFrame.add(closeButton);
}
private void initLayout() {
SpringLayout layout = new SpringLayout();
layout.putConstraint(SpringLayout.NORTH, label1, 10, SpringLayout.NORTH, testFrame.getContentPane());
layout.putConstraint(SpringLayout.EAST, label1, -5, SpringLayout.WEST, field1);
layout.putConstraint(SpringLayout.NORTH, field1, 10, SpringLayout.NORTH, testFrame.getContentPane());
layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, field1, -10, SpringLayout.HORIZONTAL_CENTER, testFrame.getContentPane());
layout.putConstraint(SpringLayout.NORTH, label2, 10, SpringLayout.SOUTH, label1);
layout.putConstraint(SpringLayout.EAST, label2, -5, SpringLayout.WEST, field2);
layout.putConstraint(SpringLayout.NORTH, field2, 5, SpringLayout.SOUTH, field1);
layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, field2, -10, SpringLayout.HORIZONTAL_CENTER, testFrame.getContentPane());
layout.putConstraint(SpringLayout.SOUTH, closeButton, -20, SpringLayout.SOUTH, testFrame.getContentPane());
layout.putConstraint(SpringLayout.EAST, closeButton, -20, SpringLayout.EAST, testFrame.getContentPane());
layout.putConstraint(SpringLayout.SOUTH, saveButton, -20, SpringLayout.SOUTH, testFrame.getContentPane());
layout.putConstraint(SpringLayout.EAST, saveButton, -10, SpringLayout.WEST, closeButton);
testFrame.setLayout(layout);
}
public void setVisible(boolean visible) {
testFrame.setVisible(visible);
}
}
我尝试将字段添加到面板中,然后在面板上使用SpringLayout.VERTICAL\u CENTER
,但没有显示任何内容
如何将字段作为一个组居中对齐?使用嵌套面板。比如:
JPanel springPanel = new JPanel(...);
springPanel.add(...);
JPanel center = new JPanel( new GridBagLayout() );
center.add(springPanel, new GridBagConstraints() );
frame.add( center );
使用嵌套面板。比如:
JPanel springPanel = new JPanel(...);
springPanel.add(...);
JPanel center = new JPanel( new GridBagLayout() );
center.add(springPanel, new GridBagConstraints() );
frame.add( center );
根据您的需要,您可以选择任意数量的选项。我更喜欢
GridBagLayout
,但这是因为我已经用了15年了
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class FormLayout {
public static void main(String[] args) {
new FormLayout();
}
public FormLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
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.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(8, 8, 8, 8);
gbc.anchor = GridBagConstraints.EAST;
add(new JLabel("Label 1"), gbc);
gbc.gridy++;
add(new JLabel("Label 2"), gbc);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridy = 0;
gbc.gridx++;
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(new JTextField(20), gbc);
gbc.gridy++;
add(new JTextField(20), gbc);
gbc.gridy++;
gbc.gridx++;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbc.weightx = 1;
add(new JButton("Save"), gbc);
gbc.weightx = 0;
gbc.gridx++;
add(new JButton("Close"), gbc);
}
}
}
问题是,对于我来说,按钮会停留在窗体的中间,靠近字段,因为窗口的大小被调整为
你可能不介意,但这让我很恼火。我更喜欢使用复合布局,将内容放在单独的面板中,按钮放在另一个面板中。这意味着我可以使用三个布局管理器的功能,而不仅仅是一个
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class FormLayout {
public static void main(String[] args) {
new FormLayout();
}
public FormLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
JPanel content = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(8, 8, 8, 8);
gbc.anchor = GridBagConstraints.EAST;
content.add(new JLabel("Label 1"), gbc);
gbc.gridy++;
content.add(new JLabel("Label 2"), gbc);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridy = 0;
gbc.gridx++;
gbc.gridwidth = GridBagConstraints.REMAINDER;
content.add(new JTextField(20), gbc);
gbc.gridy++;
content.add(new JTextField(20), gbc);
JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttons.add(new JButton("Save"));
buttons.add(new JButton("Close"));
add(content);
add(buttons, BorderLayout.SOUTH);
}
}
}
然而,选择是你自己的…根据你的需要,你有很多选择。我更喜欢
GridBagLayout
,但这是因为我已经用了15年了
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class FormLayout {
public static void main(String[] args) {
new FormLayout();
}
public FormLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
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.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(8, 8, 8, 8);
gbc.anchor = GridBagConstraints.EAST;
add(new JLabel("Label 1"), gbc);
gbc.gridy++;
add(new JLabel("Label 2"), gbc);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridy = 0;
gbc.gridx++;
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(new JTextField(20), gbc);
gbc.gridy++;
add(new JTextField(20), gbc);
gbc.gridy++;
gbc.gridx++;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbc.weightx = 1;
add(new JButton("Save"), gbc);
gbc.weightx = 0;
gbc.gridx++;
add(new JButton("Close"), gbc);
}
}
}
问题是,对于我来说,按钮会停留在窗体的中间,靠近字段,因为窗口的大小被调整为
你可能不介意,但这让我很恼火。我更喜欢使用复合布局,将内容放在单独的面板中,按钮放在另一个面板中。这意味着我可以使用三个布局管理器的功能,而不仅仅是一个
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class FormLayout {
public static void main(String[] args) {
new FormLayout();
}
public FormLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
JPanel content = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(8, 8, 8, 8);
gbc.anchor = GridBagConstraints.EAST;
content.add(new JLabel("Label 1"), gbc);
gbc.gridy++;
content.add(new JLabel("Label 2"), gbc);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridy = 0;
gbc.gridx++;
gbc.gridwidth = GridBagConstraints.REMAINDER;
content.add(new JTextField(20), gbc);
gbc.gridy++;
content.add(new JTextField(20), gbc);
JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttons.add(new JButton("Save"));
buttons.add(new JButton("Close"));
add(content);
add(buttons, BorderLayout.SOUTH);
}
}
}
然而,选择是你自己的…你必须使用
SpringLayout
?如果你能建议一种简单的方法来创建我需要的表单,而不需要添加太多额外的组件(如面板等),那么我很乐意切换SpringLayout
似乎是最灵活的,这是我唯一不能用它来做的事情。SpringLayout(与后来的GroupLayout相同)设计用于构建器,而不是手动。因此,我会投资学习其他一些经理的怪癖,我个人目前的偏好是miglayout你必须使用SpringLayout
?如果你能建议一种简单的方法来创建我需要的表单,而不需要添加太多额外的组件(如面板等),那么我很乐意切换SpringLayout
似乎是最灵活的,这是我唯一不能用它来做的事情。SpringLayout(与后来的GroupLayout相同)设计用于构建器,而不是手动。所以我会投资学习其他经理的怪癖,我个人目前的偏好是