2017-09-25 135 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)); - 它使中心上的標籤對齊。現在我想要做同樣的事情,但它應該考慮標籤文本的長度。你能推薦我怎麼做到這一點嗎? –