在Box中对齐组件

时间:2014-11-19 19:22:44

标签: java swing alignment layout-manager boxlayout

编辑:如果您对此问题进行了投票,您可以发表评论来解释原因,这将更具建设性。

我得到了这个意想不到的结果......

enter image description here

...使用此代码:

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class TestAlignment extends JFrame {

    // Constructor
    public TestAlignment() {

        super("Test Alignment");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Components to show
        JLabel leftLabel = new JLabel("Left");
        JButton centerButton = new JButton("Middle");
        JLabel rightLabel = new JLabel("Right");

        // Add all to box
        Box box = Box.createVerticalBox();
        box.add(leftLabel);
        box.add(centerButton);
        box.add(rightLabel);
        box.add(Box.createHorizontalStrut(180));

        // Align content in box
        leftLabel.setAlignmentX(LEFT_ALIGNMENT);
        centerButton.setAlignmentX(CENTER_ALIGNMENT);
        rightLabel.setAlignmentX(RIGHT_ALIGNMENT);

        // Add box to frame, and show frame
        box.setOpaque(true);
        setContentPane(box);
        setVisible(true);
    }

    // Main
    public static void main(String[] args) {
        // Create frame in EDT
        SwingUtilities.invokeLater(new Runnable() {         
            @Override public void run() { new TestAlignment(); }
        });
    }
}

我现在理解这对JComponent.setAlignmentX()的预期效果如下:此方法告诉组件的哪一侧必须对齐(顶部标签最左侧与按钮中心和底部标签最右侧对齐)。

我想了解如何让每个标签按预期方式对齐直观(左侧标签,右侧标签右侧),标签触及Box的垂直边缘?

(我知道如何将每个标签放入一个Box嵌入,并使用Box.createHorizontalGlue()强制它向左或向右,但对于简单的对齐目的来说,我觉得太多了。我和#39;我正在寻找更简单的东西)

2 个答案:

答案 0 :(得分:1)

不要以为你可以用BoxLayout做到这一点。您的示例确实显示了直观的代码,这些代码并不像您希望的那样有效。

我建议您可能需要使用GridBagLayout。我认为它支持你想要使用它的方式的setAlignmentX(...)方法。

如果没有,则可以使用Relative Layout。它很容易使用,比如BoxLayout,并且在你使用时支持你想要的对齐:

setAlignment( RelativeLayout.COMPONENT );

答案 1 :(得分:0)

您可以使用BoxLyout:

        // Components to show
    // Left
    JLabel leftLabel = new JLabel("Left");
    JPanel leftPanel = new JPanel();
    leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.X_AXIS));
    leftPanel.add(leftLabel);
    leftPanel.add(Box.createHorizontalGlue());

    // Center
    JButton centerButton = new JButton("Middle");

    // Right
    JLabel rightLabel = new JLabel("Right");
    JPanel rightPanel = new JPanel();
    rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.X_AXIS));
    rightPanel.add(Box.createHorizontalGlue());
    rightPanel.add(rightLabel);

    // Add all to box
    Box box = Box.createVerticalBox();
    box.add(leftPanel);
    box.add(centerButton);
    box.add(rightPanel);
    box.add(Box.createHorizontalStrut(180));

    // Align content in box
    // leftLabel.setAlignmentX(LEFT_ALIGNMENT);
    centerButton.setAlignmentX(CENTER_ALIGNMENT);
    // rightLabel.setAlignmentX(RIGHT_ALIGNMENT);

enter image description here