2014-09-19 88 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?标签和形状都将在根节点内进行修剪,即使在任何时候都可以正确切割字符和形状。