2013-07-17 80 views
4

我在窗格中縮放了一個節點。但是窗格的佈局考慮了界限而沒有任何轉換。我希望它考慮到轉換範圍。使用轉換邊界的佈局

例如:

enter image description here

,代碼:

import javafx.application.Application; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.scene.shape.Circle; 
import javafx.scene.transform.Scale; 
import javafx.scene.transform.Translate; 
import javafx.stage.Stage; 

public class HBoxApp extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
     public void start(Stage stage) throws Exception { 
      double scale = 0.75; 

      HBox box1 = createBox(); 
      box1.getChildren().add(new Circle(20)); 
      box1.getChildren().add(new Label("Test without any scale")); 

      HBox box2 = createBox(); 
      Circle c2 = new Circle(20); 
      c2.setScaleX(scale); 
      c2.setScaleY(scale); 
      box2.getChildren().add(c2); 
      box2.getChildren().add(new Label("Test with the setScaleX/Y methods")); 

      HBox box3 = createBox(); 
      Circle c3 = new Circle(20); 
      c3.getTransforms().add(new Scale(scale, scale)); 
      box3.getChildren().add(c3); 
      box3.getChildren().add(new Label("Test with the Scale transform")); 

      HBox box4 = createBox(); 
      Circle c4 = new Circle(20); 
      c4.getTransforms().addAll(new Scale(scale, scale), new Translate(-20*(1-scale), 0)); 
      box4.getChildren().add(c4); 
      box4.getChildren().add(new Label("Test with the Scale and Translate transform")); 

      HBox box5 = createBox(); 
      box5.getChildren().add(new Circle(20 * scale)); 
      box5.getChildren().add(new Label("My Goal")); 

      VBox vBox = new VBox(10); 
      vBox.getChildren().addAll(box1, box2, box4, box5); 
      stage.setScene(new Scene(vBox, 300, 200)); 
      stage.show(); 
     } 

    private HBox createBox() { 
     HBox box = new HBox(5); 
     box.setAlignment(Pos.CENTER_LEFT); 
     return box; 
    } 
} 

一個解決辦法是在圓上和標籤上應用的翻譯,但這種方式也不難做一個如此簡單的事情,並且使用PaneHBox)似乎比使用具有硬編碼佈局的基本Group更加痛苦。

回答

2

我找到了答案在後JavaFX1.2: Understanding Bounds

如果你想layoutBounds中匹配一個節點的物理邊界(包括特效,剪輯,轉換),然後在一個組(例如包裹它,如果你希望節點在鼠標懸停時擴大規模,並且希望其鄰居能夠爲放大的節點騰出空間)。因此,爲解決我的問題

,我寫道:

... 
HBox box5 = createBox(); 
Circle c5 = new Circle(20); 
c5.setScaleX(scale); 
c5.setScaleY(scale); 
box5.getChildren().add(new Group(c5)); 
box5.getChildren().add(new Label("Test with the Scale transform and a group")); 
... 

我得到預期的結果。

0

如果更改了在調用舞臺的show方法後設置了layoutX和layoutY屬性,則可以達到相同的效果。

... 
    stage.show(); 
    c2.setLayoutX(c2.getLayoutX()-c2.getRadius()*(1-c2.getScaleX())); 
} 

或翻譯它:

c2.getTransforms().add(new Translate(-c2.getRadius()*(1-c2.getScaleX()), 0)); 
//Replace getScaleX() with scale for c3 

,該節點的寬度不被縮放改變(檢查Node.getLayoutBounds())。

+0

感謝您的幫助。結果並不相同。我更新了我的問題。看看圓圈和標籤之間的距離。 – gontard