当前位置: 首页 > 知识库问答 >
问题:

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

宰父宾实
2023-03-14

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

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

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

商冠玉
2023-03-14

这是我使用的代码,与您的代码稍作更改以澄清问题(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?标签和形状都将在根节点内修剪,即使在任何时候都可以正确切割字符和形状。

 类似资料:
  • 不知道如何表达这个问题。如果不清楚请原谅。 如下图所示,我想拖动一个节点(圆圈)跨过父节点(窗格),一旦节点跨过父节点的边界,外部的部分就会出现在相反的一端。

  • 我正在尝试手动对齐JavaFX窗格上的节点,但似乎无法获得节点的实际外部边界。 我不知道如何更好地解释这个问题,而不是展示我创建的以下示例来演示它: 此窗口由以下代码生成: 如何获得节点的实际外部边界?

  • 有什么方法可以确定已经附加到场景但设置为不可见的节点的边界(尤其是高度和宽度)吗? 我想仅在其宽度超过100px时才在屏幕上显示标签...但它始终为 0: sysout的结果:(还有n.getWidth()也好不到哪里去) BoundingBox[minX: 0.0, minY: 0.0, minZ: 0.0,宽度: 0.0,高度: 0.0,深度: 0.0, maxX: 0.0, maxY: 0.

  • 我试图拍摄一个自定义窗格的快照(我将它放在BorderPane的中心),但是每次我得到的都是一个空白的PNG图像。我用一个按钮尝试了相同的代码,它的快照被成功地获取并保存。我检查了边界,注意到窗格的边界有最大值(父边界和局部边界): 我认为这样做的原因是窗格的布局设置得如此,因此它填充了BorderPane的中心空间。我还在文档中发现了以下内容,这支持了我的怀疑: 窗格的最大宽度和高度不受限制,这

  • 为了在JavaFX11中创建Jasper报表,我使用了动态报表。我正在Swing节点中加载报表,但Jasper报表只有在我单击stack窗格区域时才会出现,而所有其他组件只有在我悬停在所有这些组件上时才可见。组件和报表内容不是立即加载的,而不是在鼠标悬停时显示的,而报表是在滚动到堆栈窗格上时显示的。 因为这是Java8中的bug,并且似乎已经解决了,但是在Java11中,我也遇到了同样的问题。 更

  • 我有一个二叉树,我想打印所有非边界节点。边界节点:-所有叶节点从根到最左节点路径上的所有节点所有节点从根到最右节点。 我在树结构中使用了一个额外的布尔值来确定它是否是边界节点,如果不是边界节点,则进行遍历和打印。有人能想出一个更好的方法吗,因为它使用了一些额外的空间(虽然很少)。