边缘对齐摆动组件

3
有没有可能对齐Swing组件? 这些组件在单独的面板中,使用流式布局。这两个面板位于另一个使用网格布局的面板中。
如下图所示,存在微妙差别,让人感到不舒服。我知道所有的jlabels(蓝紫色的长方形)都具有相同的大小,所以我认为这可能是由于“+”和“*”,但我不确定,因为前两个框的左侧没有对齐。
这些是面板:
JPanel panel2 = new JPanel(new GridLayout(4, 1));
JPanel panel2a = new JPanel(new FlowLayout());
JPanel panel2b = new JPanel(new FlowLayout());

第一和第二个矩形(紫色)

add1 = new JLabel("", JLabel.CENTER);
add1.setTransferHandler(new TransferHandler("text"));
add1.setBorder(b2);
add2 = new JLabel("", JLabel.CENTER);
add2.setTransferHandler(new TransferHandler("text"));
add2.setBorder(b2);

两个蓝色的矩形。
textFieldA = new JTextField();
textFieldA.setHorizontalAlignment(JTextField.CENTER);
textFieldA.setEditable(false);
textFieldA.setBorder(new LineBorder(Color.blue));
textFieldM = new JTextField();
textFieldM.setHorizontalAlignment(JTextField.CENTER);
textFieldM.setEditable(false);
textFieldM.setBorder(new LineBorder(Color.blue));

加号和星号

opA = new JLabel("+", JLabel.CENTER);
opS = new JLabel("*", JLabel.CENTER);

展示矩形大小相同
Dimension d = card1.getPreferredSize(); 
int width = d.width + 100;
int height = d.height + 50;

add1.setPreferredSize(new Dimension(width, height));
add2.setPreferredSize(new Dimension(width, height));
mult1.setPreferredSize(new Dimension(width, height));
mult2.setPreferredSize(new Dimension(width, height));

textFieldA.setPreferredSize(new Dimension(width, height));
textFieldM.setPreferredSize(new Dimension(width, height));

添加到面板中

panel2a.add(add1);
panel2a.add(opA);
panel2a.add(add2);
panel2a.add(enterA);
panel2a.add(textFieldA);
panel2c.add(mult1);
panel2c.add(opM);
panel2c.add(mult2);
panel2c.add(enterM);
panel2c.add(textFieldM);
panel2.add(panel2a);
panel2.add(panel2c);

使用常规布局,我认为不行。Netbeans使用一种布局来对齐组件,我认为这种布局用代码实现非常丑陋。(它可能是自定义布局,但可能已包含在最新的Java版本中) - madth3
当然,看一下A Visual Guide to Layout Managers。我想到了GridBagLayout - MadProgrammer
2个回答

6
跨容器布局管理不是很容易实现的(或者说我从未见过能够实现的布局管理器)。
但是,您可以仔细考虑您的布局要求,并使用复合组件和布局管理器来产生一些有趣的效果... enter image description here
public class TestLayout {

    public static void main(String[] args) {
        new TestLayout();
    }

    public TestLayout() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridLayout(2, 0));
                frame.add(new CalculatePane("+"));
                frame.add(new CalculatePane("x"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class CalculatePane extends JPanel {

        public CalculatePane(String operator) {
            setLayout(new GridBagLayout());
            Font font = UIManager.getFont("TextField.font").deriveFont(Font.BOLD, 24);
            JTextField field1 = new JTextField(2);
            JTextField field2 = new JTextField(2);
            JTextField field3 = new JTextField(2);
            field1.setFont(font);
            field2.setFont(font);
            field3.setFont(font);

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);
            gbc.fill = GridBagConstraints.BOTH;
            add(field1, gbc);
            gbc.gridx++;
            add(new JLabel(operator), gbc);
            gbc.gridx++;
            add(field2, gbc);
            gbc.gridx++;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            add(new JButton("="), gbc);
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx++;
            add(field3, gbc);


        }

    }

}

6
据我所知,可以使用 GroupLayout 实现这一目标。此布局需要5个水平组和2个垂直组。

GroupLayout vertical & horizontal groups

查看如何使用GroupLayout获取示例(包括该图像的讨论)。

还可以查看此答案以获取MCVE。


1
我能看到我的周末将会花费在阅读GroupLayout上。 :P - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接