2016-02-16 46 views
5

Tôi nhầm lẫn là tại sao thiết lập Label.setAlignment (Pos.CENTER_RIGHT) không ảnh hưởng đến căn chỉnh của nhãn mà sau đó được thêm vào một GridPane? Cách duy nhất để thực hiện điều này dường như là thông qua lưới (ví dụ: ColumnConstraints) hoặc bằng ví dụ: thêm Nhãn vào một HBox có căn chỉnh đúng.Liên kết nhãn JavaFX trong GridPane

Tại sao việc đặt căn chỉnh của nhãn thành CENTER_RIGHT không có hiệu lực? Tôi có thể thấy API cho biết: "Chỉ định cách văn bản và hình ảnh trong Nhãn được căn chỉnh khi có khoảng trống trong Nhãn được gắn nhãn". Nhưng làm thế nào để tôi có được không gian trống trong một nhãn?

Trả lời

13

TL: DR phiên bản: thay vì label.setAlignment(Pos.CENTER_RIGHT); sử dụng GridPane.setHalignment(label, HPos.RIGHT);.

JavaFX sử dụng bố cục từ trên xuống. Vì vậy, cảnh kích thước nút gốc thành kích thước của cảnh, kích thước nút gốc và vị trí của mỗi nút con tùy thuộc vào chiến lược bố cục và khoảng không gian mà cảnh đã cho, mỗi nút con sau đó kích thước và vị trí các nút con của nó tùy thuộc vào chiến lược bố cục của riêng nó và lượng không gian mà nó có sẵn, và cứ như vậy xuống biểu đồ cảnh.

Theo tài liệu cho Label, các alignmentProperty

Chỉ định cách thức văn bản và đồ họa trong đã được gán nhãn nên được sắp xếp khi có khoảng trống bên trong đã được gán nhãn.

Tất nhiên, khoảng trống có sẵn cho nhãn được xác định bởi cha mẹ, trong trường hợp này là ngăn lưới. Tất nhiên bạn có thể tìm hiểu về chiến lược bố cục của khung lưới và cách cấu hình nó bằng cách đọc số documentation. Tóm lại, mặc dù:

Theo mặc định, ngăn lưới sẽ phân bổ mỗi nút kích thước ưa thích của nó và nếu ô được đặt trong đó có thêm không gian, sẽ căn chỉnh nút ở trên cùng bên trái của ô lưới. Kích thước ưa thích cho một nhãn là tất nhiên kích thước tính toán: chỉ đủ lớn để giữ nội dung của nó. Do đó bạn thấy rằng chỉ cần đặt nhãn vào ô lưới và đặt căn chỉnh trên nhãn sẽ không có hiệu lực, vì nhãn có kích thước vừa đủ lớn để giữ nội dung của nó và không có thêm khoảng trắng để căn chỉnh văn bản/đồ họa. Bạn có thể hình dung điều này bằng cách đặt màu nền hoặc đường viền trên nhãn.

Vì vậy, bạn có thể đặt căn chỉnh trên nhãn thành CENTER_RIGHT và sau đó hướng dẫn ngăn lưới để nhãn phát triển. Điều này cần hai điều: trước tiên, hãy cho khung lưới để cho nhãn điền vào chiều rộng của ô:

GridPane.setFillWidth(label, true); 

và vì khung lưới cũng sẽ tôn trọng kích thước tối đa của nút con và nhãn theo mặc định sử dụng kích thước ưa thích của nó là kích thước tối đa của nó, cho phép các nhãn để trồng:

label.setMaxWidth(Double.MAX_VALUE); 

Sau đó, nhãn sẽ phát triển đến kích thước của tế bào, và vì vậy nếu bạn cũng có

label.setAlignment(Pos.CENTER_RIGHT); 

nó sẽ gắn kết của nó riêng co ntent bên phải.

Một cách tiếp cận hợp lý hơn có lẽ là chỉ để nói với khung lưới làm thế nào để sắp xếp các nhãn trong tế bào:

GridPane.setHalignment(label, HPos.RIGHT); 

Sau đó, để cho các nhãn đi vào kích thước mặc định của nó và sự liên kết và tất cả mọi thứ sẽ làm việc.

Bạn cũng có thể sử dụng đối tượng ColumnConstraints để đặt căn chỉnh mặc định cho tất cả các nhãn trong một cột cụ thể, đây là cách tiếp cận thuận tiện hơn nếu bạn đang tạo biểu mẫu.

+0

cảm ơn bạn, đó là một phản hồi tuyệt vời. – Tranquility

+0

Một điểm lưu ý - tôi tìm thấy bằng cách đặt độ rộng ưa thích của nhãn thành giá trị lớn hơn hoặc bằng cách đặt độ rộng tối đa như bạn chỉ định và sau đó đặt căn chỉnh sang phải, nó căn chỉnh chính xác. Nói cách khác, lệnh gọi setFillWidth là không cần thiết? Bạn có thể giải thích thêm lý do tại sao đây là trường hợp và khi tôi sẽ cần phải thực sự sử dụng setFillWidth? – Tranquility

+0

'setFillWidth (true)' có nghĩa là khung lưới sẽ kích thước nút đến mức tối đa chiều rộng tối đa của nó hoặc chiều rộng của cột. Nếu 'setFillWidth' là false (mặc định), nó sẽ đặt chiều rộng của nút thành chiều rộng ưa thích của nó. Lưu ý rằng chiều rộng của cột được xác định bởi độ rộng tối đa của tất cả các nội dung của nó; do đó bằng cách tăng độ rộng pref của một nút, bạn có thể buộc cột phải rộng hơn bạn muốn. –

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