我一直在玩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);
}
}
答案 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();
}
令我惊讶的是,我发现了这个:
如您所见,绿色标签在左侧修剪但不在顶部修剪,仅修剪完整字符。虽然旋转非常轻微的蓝色标签根本没有修剪过。
我猜是有一些代码可以处理修剪字符,以便将内容保留在可见区域内......而不是扩展到其他节点。
你试过ParallelCamera
吗?标签和形状都将在根节点内修剪,即使在任何位置切割正确的字符和形状也是如此。