2017-09-25 99 views
-1

我有窗格标签就可以了。 如何设置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) ,我正试图解决它的确切问题。绑定工程,但不像我期待的那样

+2

为什么您要手动设置'layoutX',而不是使用[布局窗格](http://docs.oracle.com/javase/8/javafx/layout-tutorial/builtin_layouts.htm#JFXLY102)并配置它以标签为中心? –

+0

其实我不知道。我已经为教育目的创建了这个程序,现在它最后被删除了。但是,如果我会改变实现方式,无论如何,我想知道它是如何做到这一点 –

+0

你根本不应该这样描述你的方式。您应该使用预定义的布局窗格,或者(高级)您应该创建自己的Pane子类并覆盖各种布局方法(特别是'layoutChildren()')。几乎可以肯定的是一个合适的布局窗格可以实现您想要的功能。 –

回答

1

居中标签的正确方法是使用布局窗格并配置窗格和/或标签以使其居中。

<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,如果你选择使用它。

+0

谢谢你,因为它回答。是的,它的工作原理,但我想尝试重新发明轮子,以了解它是如何工作的:) –

+0

@Дмитрий要做到这一点,你应该继承'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) –

+0

对于我使用的另一个标签,请遵循以下代码:labelUp.layoutXProperty()。bind(pane.widthProperty()。subtract(labelUp.widthProperty())。divide(2)); - 它使中心上的标签对齐。现在我想要做同样的事情,但它应该考虑标签文本的长度。你能推荐我怎么做到这一点吗? –