2012-02-09 7 views
9

Tôi đã duyệt xung quanh và chưa tìm thấy giải pháp cụ thể phù hợp với tình huống của tôi. Tôi có một bảng điều khiển mà tôi hiển thị trong một hộp thoại:java Liên kết của bảng điều khiển BoxLayout

//create dialog panel 
JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
panel.add(headerPanel); 
panel.add(type1Panel); 
panel.add(type2Panel); 
panel.add(type3Panel); 
panel.add(type4Panel); 
panel.add(type5Panel); 
panel.add(type6Panel); 

int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION); 

Kích thước của hai tấm cuối cùng, type5 & type6, có kích thước tương đương để họ nhìn tốt. Tuy nhiên, tiêu đề và 4 bảng đầu tiên có kích thước khác nhau và tôi muốn tất cả chúng được căn trái. Kể từ đó tôi đã không tìm thấy một giải pháp tốt như thế nào để sửa lỗi này.

Câu hỏi là, làm cách nào để tôi căn chỉnh 5 ô đầu tiên, nhưng không phải cuối cùng 2? Nếu không làm thế nào tôi có thể trái align tất cả? Setalignmentx() không khả dụng cho các bảng. Tôi đã thử bằng cách sử dụng GridLayout, nhưng sau đó chiều rộng của cửa sổ chính của gui là khá lớn và không phù hợp độc đáo trên màn hình, do đó các BoxLayout dọc theo trục Y. Thanks cho bất kỳ trợ giúp hoặc gợi ý.

+0

làm việc với quyền này ngay bây giờ: tiêu đềPanel.setAlignmentX (Component.LEFT_ALIGNMENT); Nhưng có vẻ như là đồi núi. Tôi đã thấy mọi người đề cập đến để tránh làm điều này. – whitewolfpgh

+0

'Các setalignmentx() không có sẵn cho các bảng.' -' setAlignmentX() 'có sẵn cho tôi. Bạn có thể làm rõ? – Thomas

+1

Tôi cũng đã tìm ra được vấn đề. Nếu bạn làm panel.add (headerPanel); sau đó làm headerPanel.setAlignmentX (Component.LEFT_ALIGNMENT); nó sẽ không sắp xếp đúng. Tuy nhiên, làm căn chỉnh đầu tiên, sau đó thêm headerPanel vào bảng điều khiển của hộp thoại nó hoạt động tốt. Đi con số. – whitewolfpgh

Trả lời

22

Dưới đây là ví dụ sẽ căn chỉnh tất cả các JPanels được thêm vào bảng điều khiển được sử dụng làm vùng chứa.

JPanel a = new JPanel(); 
    JPanel b = new JPanel(); 
    JPanel c = new JPanel(); 

    a.setBackground(Color.RED); 
    b.setBackground(Color.GREEN ); 
    c.setBackground(Color.BLUE); 

    a.setMaximumSize(new Dimension( 10, 10)); 
    b.setMaximumSize(new Dimension( 50, 10)); 

    a.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 
    b.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 
    c.setAlignmentX(Component.LEFT_ALIGNMENT);//0.0 

    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    panel.add(a); 
    panel.add(b); 
    panel.add(c); 

    int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION); 
+4

Hãy thay thế số ma thuật bằng hằng số phù hợp. – mre

+3

Các phương thức 'setAlignmentX' và' setAlignmentY' lấy một 'float', chỉ để rõ ràng. 'JComponent' có các hằng số căn chỉnh sau được kế thừa từ' java.awt.Component': 'BOTTOM_ALIGNMENT',' CENTER_ALIGNMENT', 'LEFT_ALIGNMENT',' RIGHT_ALIGNMENT', 'TOP_ALIGNMENT'. Sử dụng chúng làm cho mã dễ đọc hơn, ít nhất là với tôi. – Paul

+4

@mre Tại sao? Đối với ví dụ này, nó chỉ phục vụ cho việc thêm độ phức tạp. Mã đơn giản và dễ đọc. Đơn giản hơn tính đồng đều cho các ví dụ như thế này. –

4

Bạn nên sử dụng setAlignmentX trên các bảng vì nó có sẵn cho JPanel. Các phương pháp setAlignmentXsetAlignmentY được tìm thấy trong JComponent, trong đó JPanel mở rộng. Nó hoạt động ... Tôi đã có mã sử dụng những phương pháp để sắp xếp JPanels trong một BoxLayout.

Ok, tốt, chỉnh sửa câu hỏi của bạn trong khi tôi đang trả lời nó :)

Thay vì sử dụng một JPanel thử sử dụng một Box. Tôi đã tìm thấy các lớp học Box là rất hữu ích như một container. Từ API:

Hộp chứa trọng lượng nhẹ sử dụng đối tượng BoxLayout làm bố cục . Hộp cung cấp một số phương thức lớp hữu ích cho các vùng chứa bằng cách sử dụng BoxLayout - ngay cả các thùng chứa không phải Hộp.

Nếu bạn chưa xem, hướng dẫn How to Use BoxLayout rất hữu ích.

+0

Cảm ơn vì điều này. 'setAlignmentX' hữu ích cho tất cả các trường hợp' JComponent'. – KomodoDave

11

Tạo đối tượng javax.swing.Box ngang để chứa từng đối tượng typenPanel. Sử dụng thanh chống ngang và keo bạn có thể làm bất cứ điều gì bạn muốn:

Box b1 = Box.createHorizontalBox(); 
b1.add(type1Panel); 
b1.add(Box.createHorizontalGlue()); 
panel.add(b1); 

Để đơn giản, hãy viết một phương pháp helper để làm điều này cho bạn:

private Component leftJustify(JPanel panel) { 
    Box b = Box.createHorizontalBox(); 
    b.add(panel); 
    b.add(Box.createHorizontalGlue()); 
    // (Note that you could throw a lot more components 
    // and struts and glue in here.) 
    return b; 
} 

Sau đó:

panel.add(leftJustify(headerPanel)); 
panel.add(leftJustify(type1Panel)); 
panel.add(leftJustify(type2Panel)); 

, vv ... Bạn có thể có được fancier với mỗi dòng, thêm các thành phần, keo, và thanh chống. Tôi đã may mắn được làm tổ sâu sắc các hộp dọc và ngang, và viết các phương thức trợ giúp khi tôi muốn thực hiện cùng một bố cục trong một hộp nhiều lần. Không có giới hạn cho những gì bạn có thể làm, trộn các thành phần, thanh chống và keo khi cần thiết.

Tôi chắc chắn có cách tốt hơn để làm tất cả điều này, nhưng tôi chưa tìm thấy. Và thay đổi kích thước động cho phép người dùng có các đoạn văn bản ngắn sử dụng một cửa sổ nhỏ và một người dùng có nhiều văn bản thay đổi kích thước để tất cả đều phù hợp.