我知道如何使用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中设置的正确值。
答案 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。