2014-11-19 2 views
-1

Редактировать: если вы поставите этот вопрос, вы можете оставить комментарий, чтобы объяснить, почему это будет более конструктивным.Выравнивание компонентов в ящике

я получить этот неожиданный результат ...

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.createHorizontalGlue(), чтобы заставить ее с левой или с правой стороны, но мне кажется слишком много для простой цели выравнивания. для чего-то более простого)

+1

Если бы вы потратили чтение момент полезные всплывающие подсказки, вы бы поняли, что это не имеет никакого отношения к тому, что было определено тегом [tag: box] для. –

ответ

1

Не думайте, что вы можете сделать это с помощью BoxLayout. В вашем примере показан интуитивно понятный код, который не работает так, как вы надеетесь.

Я предлагаю вам, вероятно, использовать GridBagLayout. Я думаю, что он поддерживает метод setAlignmentX (...) так, как вы хотите его использовать.

Если нет, то можете использовать Relative Layout. Он прост в использовании, как BoxLayout и поддерживает выравнивание вы хотите, когда вы используете:

setAlignment(RelativeLayout.COMPONENT); 
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

+0

Я уже знал, что это возможно с помощью клея. Как сказано, я ищу что-то более простое, если оно существует. В любом случае спасибо за ответ Чен. – mins