在自定义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);
不幸的是,它似乎有所不同,我是否在给定的坐标上构建文本,或者我是否在没有坐标的情况下构建文本并在之后将其重新定位:
对这种奇怪行为的任何想法?
答案 0 :(得分:3)
Text
从(0,0)位置向右和向上绘制。例如。如果你创建new Text("Hello")
并要求它限制,你会发现它们有负垂直坐标[minX:0.0, minY:-12.94921875]
恕我直言的原因是:Text
正在控件中绘制,他们更关心文本的基线。想象一下2个带有文字“水”和“水”的按钮 - 你真的希望它们在基线而不是左上角对齐:
来自另一方的
relocate()
方法适用于常规Node
s并且操作布局总是针对左上角进行计算。
答案 1 :(得分:1)
由于JavaFX的大多数部分都是开源的,因此这里是两个代码(JavaFX 8)
javafx.scene.text.Text和javafx.scene.Node。
我无法深入研究,但很明显Text constructor
和Node#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+")");
}
}
这完全符合我的想法,抱歉。