2013-05-01 20 views
5

Tôi đang đối mặt với một chút hành vi bố cục lạ khi sử dụng GirdPanes trong JavaFX 2. Trong khi nó thường dường như lan rộng không gian ngang đồng đều giữa nhiều trường, nó không làm như vậy trong một số trường hợp khác. Dưới đây là ví dụ cho thấy hiệu ứng:Tôi có thể buộc GridPane của JavaFX phân phối không gian đồng đều không?

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Control; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class TestDialog extends Stage { 
    public TestDialog() { 
     super(); 
     setTitle("Test"); 

     GridPane grid = new GridPane(); 
     grid.setHgap(5); 
     grid.setVgap(5); 
     grid.setPadding(new Insets(10, 10, 10, 10)); 

     final TextField tField1 = new TextField(); 
     final TextField tField2 = new TextField(); 
     tField2.setMaxWidth(200); 

     grid.add(createLabel("Field 1:"), 0, 0); 
     grid.add(tField1, 1, 0); 
     grid.add(createLabel("Field 2:"), 2, 0); 
     grid.add(tField2, 3, 0); 

     Pane pane = new Pane(); 
//  pane.setMinSize(600, 100); // first row has weird layout behaviour 
     pane.setMinSize(100, 100); // first row is fine 
     pane.setStyle("-fx-background-color: black"); 
     grid.add(pane, 0, 1, 4, 1); 

     grid.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE); 

     setScene(new Scene(grid)); 
    } 

    private Label createLabel(String text) { 
     Label label = new Label(text); 
     label.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE); 
     return label; 
    } 

    public static void main(String[] args) { 
     TestApplication.main(args); 
    } 

    public static class TestApplication extends Application { 
     @Override 
     public void start(Stage stage) throws Exception { 
      TestDialog dialog = new TestDialog(); 
      dialog.showAndWait(); 
     } 

     public static void main(String[] args) { 
      launch(args); 
     } 
    } 
} 

Trong ví dụ này, hộp thoại sẽ thay đổi kích thước độc đáo nếu chạy. Nếu kích thước tối thiểu của Pane bổ sung được thay đổi thành phiên bản trong chú thích, thì mọi thứ bắt đầu sai: không gian thừa trong hàng đầu tiên sẽ được chuyển thành không gian trống (thay vì phát triển trường đầu tiên), giảm kích thước hộp thoại nó đi từ trường đầu tiên đã nhỏ, để lại vùng trống còn nguyên vẹn.

Có cách nào để GridPane thực sự sử dụng không gian ngang có sẵn cho trường đầu tiên không? Tôi hiểu rằng việc giảm kích thước hộp thoại bên dưới mức tối thiểu cần thiết không nhất thiết phải là kết quả sản phẩm tốt, nhưng không mở rộng lĩnh vực này ở nơi đầu tiên có vẻ như không đồng đều với tôi.

Tôi đang sử dụng JavaFX như JDK 1.7.0_21.

Trả lời

1

Bạn sẽ phải xem xét các lớp ColumnConstraints và RowConstraints. Chúng sẽ cho GridPane biết cách phân phối không gian. Thật không may, API là nhiều hơn một chút khó xử ở đây. Nếu bạn muốn phân phối đồng đều một lượng không gian không xác định, trước tiên bạn sẽ phải thiết lập một ràng buộc, sau đó sử dụng #setPercentageWidth - tùy chọn này không có sẵn trong hàm tạo.

Tất cả trong tất cả, một GridPane với 3 cột phân bố đều (nếu có thể đồng thời tôn trọng các kích cỡ phút) sẽ trông như thế này:

public class Test extends Application { 
    public void start(final Stage stage) throws Exception { 
     final GridPane grid = new GridPane(); 
     grid.getColumnConstraints().setAll(
       ColumnConstraintsBuilder.create().percentWidth(100/3.0).build(), 
       ColumnConstraintsBuilder.create().percentWidth(100/3.0).build(), 
       ColumnConstraintsBuilder.create().percentWidth(100/3.0).build() 
     ); 
     grid.add(new Button("One"),0,0); 
     grid.add(new Button("Two"),1,0); 
     grid.add(new Button("and three"),2,0); 

     stage.setScene(new Scene(grid)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 

Bạn có thể xử lý RowConstraints cho phù hợp. Bạn cũng có thể muốn đặt căn chỉnh trong các ô để đảm bảo hộp thoại của bạn trông vẫn đẹp khi thay đổi kích thước.

+0

Tôi nhận thức được những hạn chế, nhưng cho đến nay các thử nghiệm của tôi đều tạo ra những kết quả thú vị nhưng không hữu ích. Việc tính toán độ rộng có vẻ hoàn toàn bị phá vỡ trong bối cảnh các kích thước tối thiểu hiện tại - nếu tất cả các cột được đặt thành 25% chiều rộng, cửa sổ sẽ rất lớn. Tôi đã chuyển sang MiG Layout ngay bây giờ. –