保持变量长度字符串在JavaFX中居中(使用标签)

时间:2015-09-03 23:13:25

标签: java layout javafx fxml scenebuilder

我正在使用JavaFX和SceneBuilder为教育文本处理应用程序创建前端。对于应用程序的这一部分,用户输入两个单词,然后计算它们之间的编辑距离。返回字符串列表,即字路径。此时细节并不重要,但我正在研究如何显示结果。无论长度如何,我都希望它们能够居中。我还必须处理字符串宽度对于对话框窗口来说太大的情况,因此输入也很好。现在我只使用一个AnchorPane和Labels,我很确定它太简单了,我想要一些更好的方法来做这个。

编辑:还有一个问题,当对话框第一次弹出时,标签不存在,然后一旦点击它们就会出现。

public void setResult(List<String> result) {

    numStepsLabel.setText(Integer.toString(result.size()-2));

    //TODO -- work on layout
    String str = buildResultString(result);
    pathLabel.setText(str);

}

private String buildResultString(List<String> result) {
    StringBuilder sb = new StringBuilder();

    for(String str : result) {
        sb.append(str);
        sb.append(" -> ");
    }

    // delete last ->
    sb.delete(sb.length() - 4, sb.length() -1);
    return sb.toString();
}


<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="200.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="application.EDResultController">
  <!-- TODO Add Nodes -->
  <children>
    <Label layoutX="120.0" layoutY="45.0" text="Word Path:" />
    <Label fx:id="pathLabel" layoutX="136.0" layoutY="74.0" text="Label" textAlignment="CENTER" />
    <Label layoutX="59.0" layoutY="123.0" text="Number of steps:" />
    <Label fx:id="numStepsLabel" layoutX="180.0" layoutY="123.0" text="Label" />
    <Button layoutX="132.0" layoutY="159.0" mnemonicParsing="false" text="OK" />
  </children>
</AnchorPane>

2 个答案:

答案 0 :(得分:1)

您可以在AnchorPane中设置节点的布局x和y属性。它导致给他们固定的位置,他们不能居中。替代方法是使用VBoxHBox es的组合。而不是设置x-y布局属性,因为VBox / HBox忽略它们并自动进行布局。有关不同布局的信息,请阅读Working With Layouts in JavaFX

<VBox prefHeight="200.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" 
      fx:controller="application.EDResultController" alignment="CENTER" fillWidth="true" spacing="10" >
    <!-- TODO Add Nodes -->
    <children>
        <Label text="Word Path:" />
        <Label fx:id="pathLabel" text="Label" textAlignment="CENTER" />
        <HBox alignment="CENTER" spacing="10" >
            <children>
                <Label text="Number of steps:" />
                <Label fx:id="numStepsLabel" text="Label" />
            </children>
        </HBox>
        <Button mnemonicParsing="false" text="OK" />
    </children>
</VBox>

buildResultString()也可以简化为

private String buildResultString( List<String> result )
{
    return String.join( " -> ", result);
}

答案 1 :(得分:0)

不是解决方案,但您可能想要检查buildResultString中的空列表。

// delete last ->
if (sb.length() > 0)
  sb.delete(sb.length() - 4, sb.length() - 1);