2012-02-10 56 views
5

Trong mã bên dưới, bằng cách gọi setAlignmentX với Component.LEFT_ALIGNMENT Tôi dự kiến ​​sẽ nhận được nhãn căn trái trên thanh trượt ở giữa. Vì một số lý do, nhãn cũng được căn giữa, dường như bất kể giá trị nào được chuyển tới setAlignmentX.Java Swing BoxLayout bỏ qua AlignmentX

Tôi phải chuyển giá trị nào đến setAlignmentX để căn chỉnh bên trái?

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); 
      } 
     }); 
    } 
} 

Trả lời

8

Về cơ bản, bạn không thể có sự sắp xếp khác nhau trong BoxLayout, từ How To Use BoxLayout

Nói chung, tất cả các thành phần điều khiển bởi một đối tượng từ trên xuống dưới BoxLayout nên có sự liên kết cùng X .

Sửa

Thông thường, nó không phải tài liệu mà mặc định sắp xếp một loại thành phần đã (JSlider tập trung theo mặc định, tôi nghĩ rằng sai một JLabel được tập trung trong khi nó đang canh trái ;-) Một tùy chọn là giữ một danh sách ở đâu đó (dooooh ...), một cách khác là đơn giản buộc tất cả chúng vào cùng một liên kết khi thêm.

Hoặc sử dụng trình quản lý bố cục của bên thứ ba, không có bố cục và căn chỉnh tương đối không phù hợp (đối với tôi) này.

+0

Tôi đọc trang đó nhưng tôi nghĩ rằng thanh trượt "không có" một sự liên kết. Whats cách tốt nhất để thực thi cùng một liên kết trên tất cả các thành phần là gì? – Mizipzor

+0

Unintuitive sẽ là understatement trong ngày. Nhưng ít nhất tôi có nó làm việc ngay bây giờ. Cảm ơn! :) – Mizipzor

0

BoxLayout có hành vi lạ. Cố gắng sử dụng GridBagLayout thay vì:

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); 
    } 
}