JavaFx;标签中心取决于宽度
我有窗格和标签就可以了。 如何设置layoutXProperty的标签这样它会在X线上居中? 我想我应该使用这样的公式:(Pane.width-Label.width)/ 2
但我不知道它是如何编写的。我还没有找到在谷歌的答案。JavaFx;标签中心取决于宽度
有人可以暗示我吗? thxs。
Upd。如果声明后我更新标签的文本,它的文本可以是不同的长度。所以我想设置layoutXProperty它取决于文本的长度,并将在中心。
UPD:代码插入
public void start(Stage myStage) throws FileNotFoundException {
myStage.setTitle("OrthographyChecker");
Pane pane = new Pane();
Scene scene = new Scene(pane, 700, 300);
Label labelUp = new Label();
labelUp.setFont(new Font(fontSize));
labelUp.layoutXProperty().bind(pane.widthProperty().subtract(labelUp.widthProperty()).divide(2));
labelUp.layoutYProperty().bind(pane.heightProperty().subtract(labelUp.heightProperty()).divide(5));
labelUp.setText("Click to start");
pane.getChildren().addAll(labelUp);
TextField inputTxt = new TextField("");
inputTxt.setVisible(false);
inputTxt.layoutXProperty().bind(pane.widthProperty().subtract(inputTxt.widthProperty()).divide(2));
inputTxt.layoutYProperty().bind(labelUp.layoutYProperty().add(35));
pane.getChildren().addAll(inputTxt);
Label chkL = new Label("");
chkL.setFont(new Font(fontSize));
chkL.layoutYProperty().bind(inputTxt.layoutYProperty().add(30));
chkL.layoutXProperty().bind(pane.widthProperty().subtract(chkL.widthProperty()).divide(2));
chkL.setStyle("-fx-border-color: blue;");
pane.getChildren().addAll(chkL);
inputTxt.setOnKeyPressed(event -> {
if (event.getCode().equals(KeyCode.ENTER)) {
try {
for (String OneWrd : chkWrd[0].replace(", ", ",").split(",")) {
if (inputTxt.getText().equalsIgnoreCase(OneWrd)) {
chkL.setText("You are right!");
chkL.setVisible(true);
notfound[0] = false;
break;
}
}
if (notfound[0]){
chkL.setText("Wrong! Right answer: \"" + chkWrd[0] + "\"");
chkL.setVisible(true);
}
} catch (Exception e) {
errPrint(e, "Установки ожидания ");
}
inputTxt.setText("");
pause[0] = false;
notfound[0] = true;
chkL.layoutXProperty().bind(pane.widthProperty().subtract(labelUp.widthProperty()).divide(2));
}
});
myStage.setScene(scene);
myStage.show();
}
它的代码的一部分,其使用它麻烦标签(可变CHKL)。正如你所看到的,我已经将它绑定到了中心,就像另一个标签一样。但是这个标签在标签变化文本的第一次迭代后改变了标注,并且开始看起来像that screen (label in border) ,我正试图解决它的确切问题。绑定工程,但不像我期待的那样
居中标签的正确方法是使用布局窗格并配置窗格和/或标签以使其居中。
<BorderPane>
<top>
<Label alignment="CENTER" text="A Label" fx:id="myLabel">
<maxWidth><Double fx:constant="POSITIVE_INFINITY"/></maxWidth>
</Label>
</top>
<center>
<!-- other content ... -->
</center>
<!-- other BorderPane regions as required -->
</BorderPane>
所有这里的设置可以使用场景进行:例如,如果你想在布局(或布局的区域)的顶部水平居中的标签,可以按如下所示使用BorderPane
Builder,如果你选择使用它。
谢谢你,因为它回答。是的,它的工作原理,但我想尝试重新发明*,以了解它是如何工作的:) –
@Дмитрий要做到这一点,你应该继承'Pane'并覆盖'layoutChildren()'和各种'compute ...( )'方法。我建议您查看其中一个布局窗格的源代码,例如['HBox'](http://hg.openjdk.java.net/openjfx/9/rt/file/c734b008e3e8/modules/javafx.graphics/src/main/java/javafx/scene/layout/HBox.java) –
对于我使用的另一个标签,请遵循以下代码:labelUp.layoutXProperty()。bind(pane.widthProperty()。subtract(labelUp.widthProperty())。divide(2)); - 它使中心上的标签对齐。现在我想要做同样的事情,但它应该考虑标签文本的长度。你能推荐我怎么做到这一点吗? –
为什么您要手动设置'layoutX',而不是使用[布局窗格](http://docs.oracle.com/javase/8/javafx/layout-tutorial/builtin_layouts.htm#JFXLY102)并配置它以标签为中心? –
其实我不知道。我已经为教育目的创建了这个程序,现在它最后被删除了。但是,如果我会改变实现方式,无论如何,我想知道它是如何做到这一点 –
你根本不应该这样描述你的方式。您应该使用预定义的布局窗格,或者(高级)您应该创建自己的Pane子类并覆盖各种布局方法(特别是'layoutChildren()')。几乎可以肯定的是一个合适的布局窗格可以实现您想要的功能。 –