JavaFx文本呈现在根节点的边界之外

时间:2014-09-19 17:31:09

标签: 3d javafx 2d bounds

我一直在玩JavaFx并试图掌握2D和3D实现的差异。现在我一直在将2D元素应用到3D环境中。在根节点的边界内部或外部设置它们的形状似乎很好。但是任何类型的文本都不喜欢在根节点的边界之外呈现。 (我尝试过使用Label和Text字段)。有没有办法让文本在根节点外呈现?

下面的示例设置一个红色方块和一个包含文本"测试标签的标签"在根节点的边界上。正如您将看到的那样,边界不会影响红色方块,但会影响文本。

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 个答案:

答案 0 :(得分: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吗?标签和形状都将在根节点内修剪,即使在任何位置切割正确的字符和形状也是如此。