2012-02-10 43 views
5

在下面的代碼中,通過調用setAlignmentXComponent.LEFT_ALIGNMENT我期望在中心滑塊上獲得左對齊的標籤。出於某種原因,標籤也是居中的,看起來不管傳遞給setAlignmentX的值是什麼。Java Swing BoxLayout忽略AlignmentX

我必須傳遞給setAlignmentX以使其左對齊的值是多少?

package myjava; 

import java.awt.Component; 
import java.awt.Container; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JSlider; 

public class LayoutTest { 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame("BoxLayoutDemo"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       // create left aligned label over centered column 
       Container contentPane = frame.getContentPane(); 
       contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); 
       JLabel label = new JLabel("test"); 
       label.setAlignmentX(Component.LEFT_ALIGNMENT); 
       contentPane.add(label); 
       contentPane.add(new JSlider()); 

       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

回答

8

基本上,不能有不同的對準中的BoxLayout,從How To Use BoxLayout

一般而言,所有由頂至底的BoxLayout 對象控制的部件應具有相同的X對準。

編輯

典型地,它是沒有記錄其默認對準的組件類型已經(JSlider的被默認爲中心,我錯誤地認爲,雖然這是左對齊;-)一個一個JLabel都集中選項是在某個地方保留一個列表(dooooh ...),另一個是簡單地強制它們在添加時相同的對齊。

或者使用第三方layoutManager,它沒有這種對於我來說佈局和對齊的unintuitve混合。

+0

我讀的頁面,但我認爲滑蓋「沒有」的定位。什麼是在所有組件上執行相同對齊的最佳方式? – Mizipzor 2012-02-10 13:56:23

+0

不直觀的是當天的輕描淡寫。但至少我現在已經開始工作了。謝謝! :) – Mizipzor 2012-02-10 14:17:46

0

BoxLayout有奇怪的行爲。嘗試使用GridBagLayout代替:

https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

public class Aligment { 
    public static void main(String[] args) { 

    final JPanel root = new JPanel(new GridBagLayout()); 
    root.setPreferredSize(new Dimension(500, 400)); 

    root.add(new JLabel("LEFT"), new GridBagConstraints() {{ 
     gridx = 0; 
     gridy = 0; 
     anchor = PAGE_START; 
    }}); 
    root.add(new JLabel("CENTER"), new GridBagConstraints() {{ 
     gridx = 1; 
     gridy = 1; 
     anchor = CENTER; 
     weightx = 1.0; // fill Width 
    }}); 
    root.add(new JLabel("RIGHT"), new GridBagConstraints() {{ 
     gridx = 2; 
     gridy = 2; 
     anchor = LINE_END; 
    }}); 
    // hack: Push all rows to Top 
    root.add(Box.createVerticalGlue(), new GridBagConstraints() {{ 
     gridx = 0; 
     gridy = 3; 
     weighty = 1.0; // fill Height 
    }}); 

    new JFrame() { 
     { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setContentPane(root); 
     pack(); 
     setLocationRelativeTo(null);; 
     } 
    }.setVisible(true); 
    } 
}