JavaFX在初始化期间使用已解析的变量

时间:2015-10-12 21:30:36

标签: java user-interface javafx

我知道如何使用fxml将变量解析为JavaFX中的控制器。但我需要在我的控制器的初始化方法中使用它们。有办法做到这一点吗?背景是,我有一个界面,您可以在其中定义不同的设置。现在你可以保护它们并且必须能够重新打开它们。所以现在当我打开规则时,我需要在新选项视图中设置值。我知道,它适用于文本字段(UI-Elements)以在初始化期间设置Text但不能用于变量。我尝试了不同的方法。就像绑定属性一样(适用于按钮的可见性属性(UI-Element),但不适用于要设置的变量。你知道一种方法还是其他方法?

以下是我的例子:

控制器1:

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;

/**
 *
 * @author Sandro
 */
public class FXMLDocumentController implements Initializable {

    @FXML
    private Button btn_openWindow;

    @FXML
    private void handleButtonAction(ActionEvent event) {
        try {
            Stage stage = new Stage();
            FXMLLoader loader = new FXMLLoader();
            Parent root = loader.load(getClass().getResource("fxml_second.fxml").openStream());
            Fxml_secondController cont = (Fxml_secondController)loader.getController();
            cont.setFlag(0x00000002);
            cont.setIsChange(false);
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.show();
        } catch (IOException ex) {
            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        btn_openWindow.setOnAction(this::handleButtonAction);
    }    

控制器2:

    /**
 * FXML Controller class
 *
 * @author Sandro
 */
public class Fxml_secondController implements Initializable {

    @FXML private Button btn_printOut;

    private boolean isChange = true;
    private int flag = 0x00000001;

    private void printOut(ActionEvent event){
        System.out.println("isChange: "+isChange);
        System.out.println("flag: "+flag);
    }

    public boolean isIsChange() {
        return isChange;
    }

    public void setIsChange(boolean isChange) {
        this.isChange = isChange;
    }

    public int getFlag() {
        return flag;
    }

    public void setFlag(int flag) {
        this.flag = flag;
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        btn_printOut.setOnAction(this::printOut);
        System.out.println(flag);
    }    

在控制器2中,您会看到问题所在。初始化中的控制台输出显示1,但需要显示2.如果我点击printOut(按钮),它会打印出我在控制器1中设置的正确值。

1 个答案:

答案 0 :(得分:1)

在Java代码中设置控制器,而不是在FXML中。

从fxml_second.fxml中删除fx:controller属性,然后更改FXMLDocumentController中的代码,如下所示:

@FXML
private void handleButtonAction(ActionEvent event) {
    try {
        Stage stage = new Stage();
        FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml_second.fxml"));
        Fxml_secondController cont = new Fxml_secondController();
        cont.setFlag(0x00000002);
        cont.setIsChange(false);
        loader.setController(cont);
        Parent root = loader.load();
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    } catch (IOException ex) {
        Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

另一种选择是使用custom component approach作为第二个fxml。