在中心的任一侧对齐 2 套/项目

Posted

技术标签:

【中文标题】在中心的任一侧对齐 2 套/项目【英文标题】:Align 2 sets/items on either side of center 【发布时间】:2014-06-22 06:57:21 【问题描述】:

我正在尝试找出在 Java Swing 应用程序的面板中心对齐 2 组项目的最佳方式。面板位于BorderLayoutNorth 位置,其宽度由布局的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 套/项目的主要内容,如果未能解决你的问题,请参考以下文章

在网格列中对齐项目中心[重复]

如果另一个项目不存在,Xcode会将项目对齐在中心

在中心垂直对齐项目 - Sencha Panel

Paypal 项目表单不会对齐中心

浮动后对齐中心项目

我无法垂直对齐中心的项目#vuetify