2010-04-30 31 views
10

Tôi đang sử dụng FlowLayoutJPanel. Bảng điều khiển trông xấu xí khi chiều cao thành phần con là khác nhau. Tôi đang tìm một giải pháp để làm cho chúng xếp hàng đầu (tương tự như valign="top" với các ô bảng trong HTML).Căn chỉnh hàng đầu cho FlowLayout

+1

Bạn đã xem MigLayout chưa? –

Trả lời

14

Tôi nhận ra câu hỏi này đã được hỏi hơn một năm trước, nhưng cũng giống như tôi, tôi nghĩ nhiều người sẽ vấp ngã trên bài diễn đàn này và bị bỏ lại cố gắng để tạo ra một cách giải quyết như thế một gợi ý trong báo cáo lỗi (không làm việc cho tôi chỉ là fyi).

Dù bằng cách nào thì có câu trả lời hay hơn kể từ JDK 1.6. FlowLayout có phương pháp sau đây:

public void setAlignOnBaseline(boolean alignOnBaseline) 

Nếu bạn sử dụng phương pháp này trên FlowLayout của bạn và đặt nó là sự thật, sau đó khi FlowLayout đưa ra các thành phần nó sẽ kiểm tra cơ sở của mỗi thành phần và sắp xếp các thành phần dọc đường cơ sở này.

Nhưng đó không phải là tất cả những gì bạn cần làm.

Các thành phần trong câu hỏi phải ghi đè lên hai phương pháp sau đây theo cách này:

@Override 
public Component.BaselineResizeBehavior getBaselineResizeBehavior() { 
    return Component.BaselineResizeBehavior.CONSTANT_ASCENT; 
} 

@Override 
public int getBaseline(int width, int height) { 
    return 0; 
} 

Họ là những phương pháp trong JComponent và bố trí và layoutmanagers sử dụng các phương pháp để xác định làm thế nào để bố trí các thành phần.

Nếu bạn thực hiện các bước được đề cập ở trên, tất cả các thành phần sẽ tự căn chỉnh dọc theo đầu mỗi hàng. Tất nhiên nếu bạn chỉ muốn sử dụng một thành phần như JButton, bạn rõ ràng sẽ phải mở rộng nó để đạt được mục tiêu mong muốn của bạn ... nhưng nó không làm việc nhiều như ghi đè layoutcontainer với một cách giải quyết mà bạn phải gỡ lỗi. IT nhât thi tôi nghi vậy.

Chúc may mắn, -Asaf

+1

+1. Cách giải quyết cũng không hiệu quả với tôi, nhưng tôi nghĩ đó là vì nó tồn tại cho một mục đích khác. Như được nêu trong báo cáo lỗi: * "Ba tùy chọn căn chỉnh dọc sẽ là trên cùng, giữa và dưới. ** Nó sẽ sắp xếp chính xác theo cùng một cách, ** nhưng thả các thành phần vào giữa hoặc dưới cùng của bảng điều khiển ". * – Rempelos

1

Một người nào đó đã mong muốn điều này, dưới hình thức báo cáo lỗi (cũng liệt kê một giải pháp thay thế).

Có một cái nhìn tại

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4295966

+0

Ồ. Tôi nghĩ tôi sẽ theo dõi cách giải quyết. Cảm ơn bạn! – mrpaint

+0

Trên thực tế báo cáo lỗi này có một mục đích khác nhau: * "Vui lòng thêm tùy chọn vào bố cục luồng để tôi chỉ định căn chỉnh theo chiều dọc. Ba tùy chọn căn chỉnh dọc sẽ là trên cùng, giữa và dưới. ** theo cách tương tự, ** nhưng thả các thành phần vào giữa hoặc cuối bảng. "Vì vậy, cách giải quyết của liên kết giúp bạn có thể chọn giữa ba tùy chọn cho vị trí dọc của các thành phần (FlowLayout luôn đặt chúng ở trên cùng) nhưng chúng vẫn sẽ được căn giữa với nhau trong trường hợp chúng có chiều cao khác nhau. Chỉ cần chỉ ra ... – Rempelos

1

Bạn sẽ có thể sử dụng một BoxLayout. Nó hỗ trợ liên kết dọc. Vấn đề duy nhất là bạn cần phải tự chèn các thành phần thanh ngang.

Hoặc bạn có thể thử sử dụng Relative Layout. Trong trường hợp của bạn, bạn sẽ sử dụng:

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS, 5); 
rl.setBorderGap(5); 
rl.setAlignment(RelativeLayout.LEADING); 
JPanel panel = new JPanel(rl); 
panel.add(...); 
+0

Chắc chắn tôi đã thử sự liên kết theo chiều dọc nhưng nó đã không làm việc: ( – mrpaint

+0

Điều gì không làm việc? Tôi đã cho bạn hai gợi ý và cả hai công việc.Bạn đã đọc hướng dẫn Swing về "Làm thế nào để sử dụng bố trí hộp "? Nếu bạn cần thêm trợ giúp, hãy đăng SSCCE của bạn: http: // sscce.org – camickr

+0

Cuối cùng, tôi đã mở rộng FlowLayout để làm cho nó hoạt động theo ý muốn của tôi và bây giờ nó rất tuyệt: chỉ mở rộng chiều rộng: D Cảm ơn bạn rất nhiều – mrpaint

Các vấn đề liên quan