访问FXML生成的节点

时间:2014-02-23 21:24:32

标签: java css javafx fxml

我已经创建了一个简单的JavaFX程序,分别使用CSS和FXML进行样式和布局。我如何从主Java应用程序中编辑FXML中声明的节点?具体来说,我如何更改下面显示的Text对象中的文本:

CSS

.stage {
    -fx-background-color: lightskyblue ;
    -fx-effect: innershadow(three-pass-box , rgba(0,0,0,0.6), 25, 0.0, 0, 1 );
}

.time {
    -fx-fill: white;
    -fx-font-size: 95;
    -fx-font-family: 'sans-serif';
    -fx-effect: dropshadow(three-pass-box , rgba(0,0,0,0.6), 2, 0.0, 0, 1 );
}

FXML

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

<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>

<BorderPane fx:id="mainStage" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" styleClass="stage" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
  <center>
    <Text fx:id="time" styleClass="time" text="Text" />
  </center>
  <stylesheets>
    <URL value="@application.css" />
  </stylesheets>
</BorderPane>

Java程序

public class Main extends Application {

    @Override
    public void start(Stage stage) {

        Parent root;
        try {
            root = FXMLLoader.load(getClass().getResource("layout.fxml"));

            Scene scene = new Scene(root, 300, 275);

            stage.setTitle("FXML Welcome");
            stage.setScene(scene);
            stage.show();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

1 个答案:

答案 0 :(得分:1)

为FXML添加一个控制器类,并带有正确的注释:

public class MyCtrl {
    @FXML private Text time; // name must be the same as fx:id
}

在FXML中声明控制器(还有其他方法,这可能是最简单的):

<BorderPane fx:id="mainStage" ... fx:controller="mypackage.MyCtrl">

然后你可以从控制器中访问它,例如来自initialize()方法:

public void initialize() {
    text.setText("xyz");
}

(您可能希望在MyCtrl.initialize()设置一个计时器,定期使用当前时间调用setText()。)