2014-09-19 71 views
0

我一直在玩弄JavaFx,並試圖掌握2D和3D實現的差異。現在我一直在將2D元素應用到3D環境中。形狀似乎可以在任何設置的地方渲染,無論是在根節點的邊界之內還是之外。但是任何類型的文本都不喜歡在根節點的邊界之外渲染。 (我曾嘗試使用標籤和文本字段)。有沒有辦法讓文字在根節點之外渲染?JavaFx文本渲染超出根節點的邊界

下面的示例將在根節點的邊界上設置一個紅色正方形和一個包含文本「test label」的標籤。正如你將看到的邊界不影響紅色方塊,但這樣做的文字。

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.PerspectiveCamera; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class TreeRoot extends Application { 

@Override 
public void start(Stage stage) throws Exception { 
    Rectangle square = new Rectangle(); 
    square.setWidth(50); 
    square.setHeight(50); 
    square.setLayoutX(20); 
    square.setLayoutY(20); 
    square.setStyle("-fx-fill: red;"); 

    Group sceneRoot = new Group(); 

    Scene scene = new Scene(sceneRoot); 
    PerspectiveCamera camera = new PerspectiveCamera(true); 
    camera.setNearClip(0.1); 
    camera.setFarClip(10000); 
    camera.setTranslateZ(-1000); 
    scene.setCamera(camera); 

    stage.setScene(scene); 
    stage.show(); 

    Label label = new Label("Test label"); 
    label 
    .setStyle("-fx-font: 100px Tahoma;-fx-fill: linear-gradient(from 0% 0% to 100% 200%, repeat, aqua 0%, red 50%);-fx-stroke: white; -fx-stroke-width: 1;"); 
label.setTranslateX(-100); 
square.setTranslateX(-50); 
sceneRoot.getChildren().add(square); 
sceneRoot.getChildren().add(label); 
} 

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

回答

1

這是我用過的,從你的一點點變化,以澄清問題的代碼(StackPane,而不是Group和一些彩色背景):

@Override 
public void start(Stage stage) { 
    Label txtH1 = new Label("Test Label"); 
    txtH1.setStyle("-fx-font: 60px Tahoma; -fx-text-fill: green;"); 
    txtH1.setTranslateY(-120); 
    txtH1.setTranslateX(-240); 

    Label txtH2 = new Label("Test Label Rotated"); 
    txtH2.setStyle("-fx-font: 60px Tahoma; -fx-text-fill: blue;"); 
    txtH2.setTranslateX(-240); 
    txtH2.setRotate(0.001); 

    Rectangle square = new Rectangle(); 
    square.setWidth(50); 
    square.setHeight(50); 
    square.setStyle("-fx-fill: red;"); 

    StackPane sceneRoot = new StackPane(); 
    sceneRoot.setStyle(("-fx-background-color: yellow;")); 
    sceneRoot.getChildren().add(txtH1); 
    sceneRoot.getChildren().add(txtH2); 
    sceneRoot.getChildren().add(square); 
    square.setTranslateY(-200); 
    square.setTranslateX(-400); 

    Scene scene = new Scene(sceneRoot,Color.GREENYELLOW); 
    PerspectiveCamera camera = new PerspectiveCamera(true); 
    camera.setNearClip(0.1); 
    camera.setFarClip(10000); 
    camera.setTranslateZ(-1000); 
    scene.setCamera(camera); 

    stage.setScene(scene); 
    stage.show(); 
} 

令我驚訝,我已經發現了這一點:

Testing labels with a perspective camera

正如你所看到的,綠色的標籤在左邊,但不是在頂部,只修剪完整的字符被修剪。雖然非常輕微的旋轉的藍色標籤根本不會被修剪。

我的猜測是有一些代碼處理修剪字符時儘可能保持在可見區域內的東西......不擴展到其他節點。您是否嘗試過ParallelCamera?標籤和形狀都將在根節點內進行修剪,即使在任何時候都可以正確切割字符和形狀。