【发布时间】:2020-10-17 13:33:25
【问题描述】:
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.scene.text.TextBoundsType;
import javafx.stage.Stage;
public class HorizontalTextAlignment extends javafx.application.Application {
@Override
public void start(Stage stage) {
var rectangle = new Rectangle(600, 100, Color.TURQUOISE);
var text = new Text(rectangle.getWidth() / 2, rectangle.getHeight() / 2, "TEXT");
text.setBoundsType(TextBoundsType.VISUAL);
text.setFont(new Font(100));
text.setTextAlignment(TextAlignment.CENTER);
text.setTextOrigin(VPos.CENTER);
stage.setScene(new Scene(new Pane(rectangle, text)));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我需要在不使用任何布局的情况下将文本居中。您可能会注意到,虽然垂直对齐有效,但水平对齐无效。当然,这可以通过简单的计算来解决。
// You need to change the horizontal position of the text for this to work.
var text = new Text(rectangle.getLayoutX(), rectangle.getHeight() / 2, "TEXT");
...
var rectangleWidth = rectangle.getWidth();
var textWidth = text.getLayoutBounds().getWidth();
text.setLayoutX((rectangleWidth - textWidth) / 2);
问题是,虽然在图片中不容易看出它并不完全在中间。
这很好看你是否只改变初始化。
var text = new Text(rectangle.getLayoutX(), rectangle.getHeight() / 2, "TEXT");
但是,这不能通过简单地从水平位置减去所需值(在本例中为 -2)来解决,因为当我更改文本时。
必须减去 9。这就是问题所在。我永远无法提前知道必须从水平位置中扣除多少。
请问我该如何解决?
谢谢
【问题讨论】:
-
你可以使用Label吗?
-
哦,我没想到。当然是的。但是,它会有所帮助还是结果会一样?我不确定。
-
由于标签具有文本对齐属性,我希望您仍然需要做一些工作。我会尝试将标签的最小宽度绑定到包含窗格的宽度。
-
使用布局管理器。如果你不这样做,你的老师就不会正确地展示材料。
-
我认为您的要求没有意义。根据定义,居中是“布局”。 JavaFX 中支持的布局方式是使用某种
Pane(您正在这样做):使用现有的Pane子类,或者编写自己的Parent子类(或Region或Pane)并覆盖适当的方法(最重要的是layoutChildren())。但真正的Label似乎有你需要的功能。
标签: java javafx layout position text-alignment