如何在JavaFX中设置按钮文本?

时间:2014-08-04 18:07:54

标签: java button initialization javafx-2 fxml

我正在尝试使用以下代码设置按钮文本:

public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub
    //checking to see whether these buttons were loaded from the FXML file
    assert fx_btnStart != null : "fx:id=\"fx_btnStart\" was not injected: Check your FXML file 'FX-Timer.fxml'.";
    assert fx_btnStop != null : "fx:id=\"fx_btnStop\" INJECTION ERROR";
    assert fx_btnHourUp != null : "fx:id=\"fx_btnHourUp\" INJECTION ERROR";
    assert fx_btnHourDown != null : "fx:id=\"fx_btnHourDown\" INJECTION ERROR";
    assert fx_btnMinuteUp != null : "fx:id=\"fx_btnMinuteUp\" INJECTION ERROR";
    assert fx_btnMinuteDown != null : "fx:id=\"fx_btnMinuteDown\" INJECTION ERROR";
    //ending of initialization of FXML elements 

    //set words for buttons yo.
    fx_btnHourUp.setText("HELLO");
}

这是我的FXML:

<children>
            <Button mnemonicParsing="false" prefHeight="53.0" prefWidth="92.0"
                text="Hup" textAlignment="CENTER" alignment="CENTER" id="fx_btnHourUp"/>
            <Button mnemonicParsing="false" prefHeight="37.0" prefWidth="92.0"
                text="Hdown" GridPane.columnIndex="1" textAlignment="CENTER"
                alignment="CENTER" id="fx_btnHourDown" />
            <Button mnemonicParsing="false" prefHeight="44.0" prefWidth="92.0"
                text="Mup" GridPane.columnIndex="2" textAlignment="CENTER"
                alignment="CENTER" id="fx_btnMinuteUp" />
            <Button mnemonicParsing="false" prefHeight="39.0" prefWidth="122.0"
                text="Mdown" GridPane.columnIndex="3" textAlignment="CENTER"
                alignment="CENTER" id="fx_btnMinuteDown" />
        </children>

但是它不起作用我真的不明白为什么,是否有其他人知道如何使用JavaFX设置按钮文本? &GT;取代;我觉得JavaFX并不像Swing那么简单......但无论如何,任何人都知道我做错了什么?另外,有没有人知道学习FXML的任何资源我喜欢FXML而不是用Java编写它,但似乎没有太多内容,我是否喜欢世界上唯一更喜欢FXML而不是JavaFX GUI编码的人?

2 个答案:

答案 0 :(得分:2)

为什么按钮文字不会在您的程序中更改

一个。您永远不会将您的控制器与您的FXML相关联。

由于控制器永远不会与FXML相关联,因此永远不会实例化控制器,并且永远不会运行设置按钮文本的控制器初始化代码。

湾您在FXML中的项目上设置了CSS id而不是FXML fx:id

如果没有为FXML中的项目设置fx:id,FXML不会将对这些项目的Java对象的引用注入控制器类。

首次开始编写FXML应用程序时,这些是非常常见的错误。如果您愿意,可以通过javasedocs_us@oracle.com向Oracle写信,并附上该答案的链接,并要求Oracle向their documentation添加FXML故障排除部分或常见问题部分。

将控制器与FXML关联

或者:

  1. 使用fx:controller attribute

    在您的示例中,将fx:controller属性添加到根节点; e.g。

    <BorderPane fx:controller="application.FX_TimerController" ...
    

    或者

  2. FXML加载程序中的
  3. Set a controller

    有关如何执行此操作的信息,请参阅Passing Parameters JavaFX FXML

  4. 设置fx:id

    而不是:

    <Button ... id="fx_btnHourUp"/>
    

    写:

    <Button ... fx:id="fx_btnHourUp"/>
    

答案 1 :(得分:2)

您确定您的元素实际上不是null并且您的断言语句实际上正在执行它们应该执行的操作吗?有关使用assert语句的信息,请Click me。确保您的变量声明保留为@FXML private Button fx_btnHourUp;,并且您永远不会通过fx_btnHourUp = new Button();自行实例化该按钮。

您是否使用SceneBuilder 2.0来创建fxmls?这是一个允许您设计fxmls同时避免许多这类常见错误的程序。 Download link here.