在中心的任一侧对齐 2 套/项目
Posted
技术标签:
【中文标题】在中心的任一侧对齐 2 套/项目【英文标题】:Align 2 sets/items on either side of center 【发布时间】:2014-06-22 06:57:21 【问题描述】:我正在尝试找出在 Java Swing 应用程序的面板中心对齐 2 组项目的最佳方式。面板位于BorderLayout
的North
位置,其宽度由布局的Center
位置中的JTextField
确定。我遇到的问题是,我有一组要居中的标签和较小的文本字段,以便标签的结尾和第一个文本字段的开头在面板的中心相遇。
我试过GroupLayout
,但结果如下:
注意:由 + 分隔的 2 个文本字段位于子面板中。
我想要达到的目标如下:
显然我要么遗漏了一些东西,要么这比需要做的要复杂得多。我实际上经常遇到这个问题!我很惊讶没有专门针对此的特殊网格布局。
尝试使用 GridLayout
执行此操作会导致以下结果:
那么...什么是最简单的方法来获得我正在寻找的布局(第二张图片)?
GroupLayout
下面的示例代码:
JFrame frame = new JFrame();
JPanel panel = new JPanel(new BorderLayout());
frame.setContentPane(panel);
JPanel longText = new JPanel();
JPanel shortText = new JPanel();
JPanel mediumText = new JPanel();
longText.add(new TextField(5));
longText.add(new JLabel("+"));
longText.add(new TextField(5));
shortText.add(new TextField(5));
shortText.add(new JLabel("+"));
shortText.add(new TextField(5));
mediumText.add(new TextField(5));
mediumText.add(new JLabel("+"));
mediumText.add(new TextField(5));
JLabel lExample = new JLabel("Long text example:");
JLabel sExample = new JLabel("Short:");
JLabel mExample = new JLabel("Medium Example:");
JPanel subPanel = new JPanel();
GroupLayout layout = new GroupLayout(subPanel);
subPanel.setLayout(layout);
layout.setHorizontalGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(Alignment.CENTER)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(Alignment.TRAILING)
.addComponent(lExample)
.addComponent(sExample)
.addComponent(mExample))
.addGroup(layout.createParallelGroup(Alignment.TRAILING)
.addComponent(longText)
.addComponent(shortText)
.addComponent(mediumText))))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER))
);
layout.setVerticalGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(lExample)
.addComponent(longText))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(sExample)
.addComponent(shortText))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(mExample).addComponent(mediumText))
);
JTextArea textArea = new JTextArea()
@Override
public Dimension getPreferredSize()
return new Dimension(600,300);
;
textArea.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setAutoscrolls(true);
panel.add(subPanel,BorderLayout.NORTH);
panel.add(textArea,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
【问题讨论】:
也可以考虑GroupLayout
,见here。
添加了我返回 GroupLayout
结果的代码。 @MadProgrammer:您能否提供一个如何使用 GridBagLayout 执行此操作的示例?我可能正在考虑使用旧的 Photoshop javascript UI,但我记得上次我让它们在中间相遇时标签和文本字段没有对齐。
若想尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。
【参考方案1】:
考虑使用GridBagLayout
,因为它可以让您更好地控制单个组件的放置,并尽可能尊重组件的首选大小(除非您通过使用GridBagConstraints
覆盖它们)
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
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 LayoutExample
public static void main(String[] args)
new LayoutExample();
public LayoutExample()
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()
JLabel longText = new JLabel("Long Text Example");
JLabel shortText = new JLabel("Short Example");
JLabel medText = new JLabel("Medium Example");
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.EAST;
add(longText, gbc);
addFields(gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.EAST;
add(shortText, gbc);
addFields(gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.EAST;
add(medText, gbc);
addFields(gbc);
protected void addFields(GridBagConstraints gbc)
JTextField field1 = new JTextField("0", 5);
field1.setEnabled(false);
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridx++;
add(field1, gbc);
gbc.gridx++;
gbc.insets = new Insets(0, 4, 0, 4);
add(new JLabel("+"), gbc);
JTextField field2 = new JTextField(5);
gbc.gridx++;
add(field2, gbc);
【讨论】:
非常好!这很好地排列了它们。非常感谢!以上是关于在中心的任一侧对齐 2 套/项目的主要内容,如果未能解决你的问题,请参考以下文章