2012-04-25 60 views
15

Tôi có một ứng dụng JavaFX 2.0 với FXML. Tôi muốn các thành phần (TextFields, ComboBoxes, bố cục, vv) được thay đổi kích thước khi một cửa sổ với một ứng dụng được thay đổi kích cỡ. Vậy ...Làm cách nào để liên kết thay đổi kích thước với kích thước của các thành phần?

  • Vì nó được viết trên Oracle documentation for JavaFX, để làm một cái gì đó như thế này với hình dạng, có một vài tính chất đặc biệt để hình dạng:

Khi xây dựng các ứng dụng GUI với JavaFX, bạn sẽ nhận thấy rằng các lớp nhất định trong API đã triển khai các thuộc tính. Ví dụ: lớp javafx.scene.shape.Rectangle chứa thuộc tính cho arcHeight, arcWidth, height, width, xy. Đối với mỗi thuộc tính này, sẽ có các phương thức tương ứng phù hợp với các quy ước được mô tả trước đó. . Ví dụ, getArcHeight(), setArcHeight(double), arcHeightProperty(), mà cùng nhau chỉ ra (cho cả nhà phát triển và các công cụ) mà tài sản được tồn tại *

  • Để thêm người nghe đến một giai đoạn tôi phải làm một cái gì đó như:

    stage.resizableProperty().addListener(new ChangeListener<Boolean>(){ 
        @Override 
        public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2){ 
         throw new UnsupportedOperationException("Not supported yet."); 
        } 
    
    }); 
    

Vì vậy, có hai câu hỏi:

  • Để làm cho một số ràng buộc tôi phải có được giai đoạn của tôi trong lớp điều khiển. Vậy - làm thế nào tôi có thể có được một giai đoạn trong một lớp điều khiển?
  • Có vẻ như các điều khiển giao diện người dùng không có bất kỳ thuộc tính width \ height nào, để được ràng buộc với một cái gì đó. Hoặc có lẽ tôi đã không tìm thấy chúng.

Vì vậy, làm cách nào tôi có thể giải quyết được sự cố của mình?

UPD. Giới thiệu về Trình tạo cảnh cho Sergey Grinev: Khi tôi sử dụng Ctrl + K trên thành phần của mình (yêu cầu nó chiếm toàn bộ khu vực của thành phần chính) - mọi thứ đều ổn.

Nhưng điều gì sẽ xảy ra nếu tôi muốn thông báo cho thành phần của mình chiếm 50% của một khu vực? Để kiểm tra, tôi có một tab có hai VBox trên đó. Chiều rộng của tab là 100px. Chiều rộng của Vbox là 50px cho mỗi độ rộng. VBox1 có x1 = 0x2 = 50 và VBox2 có x1 = 50x2 = 100. Sau đó, tôi đổi kích thước cửa sổ của mình bằng ứng dụng JavaFX. Bây giờ tôi có tab Width = 200px. Nhưng các ô ngang độ rộng của tôi vẫn còn = 50px: VBox1 có x1 = 0x2 = 50 và VBox2 có x1 = 150x2 = 200. Và tôi cần họ được VBox1 x1 = 0x2 = 100 và VBox2 x1 = 100x2 = 200. Trường hợp giá trị x1 và x2 là tọa độ của các góc VBoxes.

Trình tạo cảnh có thể giúp tôi trong tình huống này như thế nào?

Trả lời

7

Một tùy chọn dễ dàng là sử dụng JavaFX Scene Builder (thời gian gần đây trở nên có sẵn như là phiên bản beta công cộng: http://www.oracle.com/technetwork/java/javafx/tools/index.html)

Nó cho phép tạo giao diện người dùng bằng cách kéo-và-thả và neo UI yếu tố để biên giới (bởi anchor tool), do đó chúng di chuyển/thay đổi kích thước với các đường viền cửa sổ.

UPDATE:

Để đạt được bố trí tỷ lệ autoresizing bạn có thể sử dụng GridPane với ColumnConstraint:

public void start(Stage stage) { 

    VBox box1 = new VBox(1); 
    VBox box2 = new VBox(1); 

    //random content 
    RectangleBuilder builder = RectangleBuilder.create().width(20).height(20); 
    box1.getChildren().addAll(builder.build(), builder.build(), builder.build()); 
    builder.fill(Color.RED); 
    box2.getChildren().addAll(builder.build(), builder.build(), builder.build()); 

    //half by half screen 
    GridPane grid = new GridPane(); 
    grid.addRow(0, box1, box2); 

    ColumnConstraints halfConstraint = ColumnConstraintsBuilder.create().percentWidth(50).build(); 
    grid.getColumnConstraints().addAll(halfConstraint, halfConstraint); 

    stage.setScene(new Scene(grid, 300, 250)); 
    stage.show(); 
} 
+0

Tôi đã phản hồi nhận xét của bạn như là một bản cập nhật cho câu hỏi, như tôi đã được ra khỏi nhân vật. –

+0

hãy xem cập nhật, vui lòng. –

+1

Typo - GripPane – Avik

3

Gợi ý:

  1. Nếu bạn chỉ có một giai đoạn chính sau đó lưu nó trong một lĩnh vực/biến tĩnh trong khi các ứng dụng khởi động và truy cập nó trong tất cả các lớp điều khiển.
  2. Bạn có thể đặt tất cả các điều khiển/thành phần vào bố cục/ngăn để tự động quản lý bố cục của nó. Đối với các bố cục khác nhau, hãy kiểm tra tài liệu api. Sau đó, liên kết các thuộc tính chiều rộng và chiều cao của cảnh sân khấu với thuộc tính của bố cục này cho phù hợp. Thêm thông tin về giao diện ràng buộc tại Using JavaFX Properties and Binding.
    Ví dụ về unidirectional binding
20

Một số gợi ý cho việc xây dựng giao diện đồ họa thay đổi kích thước =>

  • Hãy chắc chắn rằng thư mục gốc của ứng dụng của bạn là một lớp con Pane, chứ không phải là một nhóm.
  • Bỏ kích thước tối đa của các nút (ví dụ: button.setMaxSize (Double.MAX_VALUE, Double.MAX_VALUE).
  • Hầu hết thời gian các khay bố cục có thể xử lý thay đổi kích thước cho bạn và bạn không cần ràng buộc và người nghe =
  • Điều khiển giao diện người dùng và khung bố cục là Vùng => tất cả các Vùng có thuộc tính chiều cao và chiều rộng chỉ đọc mà bạn có thể nghe và liên kết với.
  • Bạn không thể trực tiếp ràng buộc chiều cao thay vào đó hãy sử dụng thuộc tính độ rộng/chiều cao, độ dài prefWidth/Height, maxWidth/Height.
  • Khung cảnh có chiều cao và chiều rộng phù hợp es bạn có thể liên kết nếu cần. Nếu bạn làm điều này, khi giai đoạn được thay đổi kích thước, cảnh sẽ được thay đổi kích thước, sau đó các thành phần bị ràng buộc của bạn sẽ được thay đổi kích thước. Nếu thư mục gốc của cảnh của bạn là một khung bố trí chứ không phải là một nhóm, thì ràng buộc này thường không cần thiết.
  • Nếu bạn không đặt chiều cao và chiều rộng cho cảnh, đối với ứng dụng độc lập, cảnh (và sân khấu) sẽ có kích thước phù hợp với kích thước ưa thích của nút gốc của cảnh (thường là thứ bạn muốn).
  • Nếu bạn thất bại, bạn có thể bắt đầu ghi đè phương thức bố cục của bố mẹ.

Đây là an example của giao diện người dùng JavaFX có thể thay đổi kích thước thực hiện một số nguyên tắc ở trên.

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