2012-09-12 40 views
5

Tôi đã cố gắng làm việc với phép biến đổi tỷ lệ trong JavaFX, nhưng chưa hoàn toàn có thể quấn đầu quanh nó. Về cơ bản, tôi có một Pane chứa một biểu đồ phức tạp và muốn có khả năng rescale nó. Phần tỷ lệ chính nó hoạt động tốt, tuy nhiên, khung cuộn kèm theo sẽ không thích ứng với biểu đồ.Mở rộng quy mô trong JavaFX và ScrollPanes

Để đơn giản, tôi sẽ đăng một ví dụ ngắn, trong đó đồ thị của tôi được thay thế bằng một nhãn:

public class TestApp extends Application { 
    @Override public void start(final Stage stage) throws Exception { 
     final Label label = new Label("Hello World"); 
     label.getTransforms().setAll(new Scale(0.5, 0.5)); 

     label.setStyle("-fx-background-color:blue"); 
     label.setFont(new Font(200)); 

     final ScrollPane scrollPane = new ScrollPane(); 
     scrollPane.setContent(label); 

     stage.setScene(new Scene(scrollPane)); 
     stage.setWidth(200); 
     stage.setHeight(100); 
     stage.show(); 
    } 

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

Nhãn sẽ mở rộng quy mô một cách chính xác, nhưng các thanh cuộn cửa sổ của kèm theo vẫn sẽ chứa một thành phần của kích thước ban đầu.

tôi đã cố gắng cho đến nay:

  • Chơi xung quanh với các nhãn min và kích thước pref
  • gói nhãn bên trong một Group (không có thanh cuộn sẽ xuất hiện bất cứ điều gì)
  • rộng Tập đoàn kèm theo khá so với nhãn

Tôi đang thiếu gì? Tôi có thể làm gì để làm cho ScrollPane thích ứng với chế độ xem nội dung?

Cảm ơn sự giúp đỡ của bạn.

+0

Có thể mở rộng, có thể cuộn được: https://stackoverflow.com/a/44314455/1386911 –

Trả lời

3

Tôi đã triển khai nhân rộng trong ScrollPane cho Đồ thị và các nút khác trong this example of scrollpane viewports, transforms and layout bounds in JavaFX.

Mã được triển khai khi tôi học JavaFX lần đầu tiên, vì vậy chắc chắn mã có thể sạch hơn và có lẽ có những cách đơn giản hơn để thực hiện việc này (ví dụ: sử dụng Nhóm làm vùng chứa cho nút được chia tỷ lệ như được đề xuất trong ScrollPane documentation).

Một chìa khóa để nhận các giải pháp tôi muốn (thanh cuộn chỉ xuất hiện khi bạn phóng to và nút lớn hơn khung nhìn có thể nhìn thấy), là mã này:

// create a container for the viewable node. 
final StackPane nodeContainer = new StackPane(); 
nodeContainer.getChildren().add(node); 

// place the container in the scrollpane and adjust the pane's viewports as required. 
final ScrollPane scrollPane = new ScrollPane(); 
scrollPane.setContent(nodeContainer); 
scrollPane.viewportBoundsProperty().addListener(
    new ChangeListener<Bounds>() { 
    @Override public void changed(ObservableValue<? extends Bounds> observableValue, Bounds oldBounds, Bounds newBounds) { 
    nodeContainer.setPrefSize(
     Math.max(node.getBoundsInParent().getMaxX(), newBounds.getWidth()), 
     Math.max(node.getBoundsInParent().getMaxY(), newBounds.getHeight()) 
    ); 
    } 
}); 

... 

// adjust the view layout based on the node scalefactor. 
final ToggleButton scale = new ToggleButton("Scale"); 
scale.setOnAction(new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent actionEvent) { 
    if (scale.isSelected()) { 
     node.setScaleX(3); node.setScaleY(3); 
    } else { 
     node.setScaleX(1); node.setScaleY(1); 
    } 
    // runlater as we want to size the container after a layout pass has been performed on the scaled node. 
    Platform.runLater(new Runnable() { 
     @Override public void run() { 
     nodeContainer.setPrefSize(
      Math.max(nodeContainer.getBoundsInParent().getMaxX(), scrollPane.getViewportBounds().getWidth()), 
      Math.max(nodeContainer.getBoundsInParent().getMaxY(), scrollPane.getViewportBounds().getHeight()) 
     ); 
     } 
    }); 
    } 
}); 
+0

Cảm ơn phản hồi của bạn. Mã tạo ra một số hiệu ứng phụ khá lạ (ví dụ: khi giảm tỷ lệ, các thanh cuộn sẽ không thích ứng chính xác cho đến khi di chuyển), nhưng cách tiếp cận chắc chắn là chính xác. Điều này đã giúp tôi rất nhiều. – sarcan

8

Theo tài liệu ScrollPane có lẽ bạn cố gắng để bọc một Pane trong một nhóm để ScrollPane được cuộn bởi hình ảnh ràng buộc không phải là bố trí thực tế bị ràng buộc.

ScrollPane layout calculations are based on the layoutBounds rather than the 
boundsInParent (visual bounds) of the scroll node. If an application wants the 
scrolling to be based on the visual bounds of the node (for scaled content etc.), 
they need to wrap the scroll node in a Group. 
Các vấn đề liên quan