JavaFX Text构造函数与重定位

时间:2013-02-28 19:13:13

标签: text javafx-2 placement

在自定义JavaFX UI控件中,我想在Control的角落放置一些文本。以下是我的Skin类的源代码:

double width = control.getWidth();
double height = control.getHeight();

Text test1Text = new Text(0, 0, "top left");
Text test2Text = new Text(0, height-1, "bottom left");
Text test3Text = new Text("top right");
test3Text.relocate(width - test3Text.getLayoutBounds().getWidth(), 0);
Text test4Text = new Text("bottom right");
test4Text.relocate(width - test4Text.getLayoutBounds().getWidth(), height-1);

不幸的是,它似乎有所不同,我是否在给定的坐标上构建文本,或者我是否在没有坐标的情况下构建文本并在之后将其重新定位:

  • 在第一种情况下,构造函数中的坐标将是文本的左下角坐标。
  • 在第二种情况下,给定的坐标将是左上角的坐标。

对这种奇怪行为的任何想法?

2 个答案:

答案 0 :(得分:3)

Text从(0,0)位置向右和向上绘制。例如。如果你创建new Text("Hello")并要求它限制,你会发现它们有负垂直坐标[minX:0.0, minY:-12.94921875]

恕我直言的原因是:Text正在控件中绘制,他们更关心文本的基线。想象一下2个带有文字“水”和“水”的按钮 - 你真的希望它们在基线而不是左上角对齐:

enter image description here

来自另一方的

relocate()方法适用于常规Node s并且操作布局总是针对左上角进行计算。

答案 1 :(得分:1)

由于JavaFX的大多数部分都是开源的,因此这里是两个代码(JavaFX 8)
javafx.scene.text.Textjavafx.scene.Node
我无法深入研究,但很明显Text constructorNode#relocate()正在做不同的事情:
文本构造函数

public Text(double x, double y, String text) {
    this(text);
    setX(x);
    setY(y);
}

节点#移居()

public void relocate(double x, double y) {
        setLayoutX(x - getLayoutBounds().getMinX());
        setLayoutY(y - getLayoutBounds().getMinY());

        PlatformLogger logger = Logging.getLayoutLogger();
        if (logger.isLoggable(PlatformLogger.FINER)) {
            logger.finer(this.toString()+" moved to ("+x+","+y+")");
        }
}

这完全符合我的想法,抱歉。