[英]How to access a variable from one class controller file to another in JavaFX?
[英]Access to variable from one controller in second controller in javafx
我知道有很多關於傳遞參數的線程,但是我還是不明白。
我有MainController
類的Main.fxml
階段。 在這個類中,我創建了例如變量int x = 5
。 然后,我在該階段上單擊按鈕,這將創建一個帶有SecondController
新階段,可以在其中修改此值。 在MainController
有x
值的setter和getter方法。 在SecondController
我可以從MainController
獲取x
值並對其進行編輯,但最后,當我關閉第二階段時,我嘗試通過MainController
的setter方法使用新數字設置此編輯后的值。 然后我關閉它的舞台,然后像第一次一樣再次打開它。 但是我看不到新的編輯值,我再次看到了默認創建的值。
這是我的MainController
,它稱為FirstController
:
public class FirstController {
private int x = 5;
@FXML
private Label label;
@FXML
void click(ActionEvent event) {
SecondController secondController = new SecondController();
secondController.startSecondController(new Stage());
}
@FXML
public void initialize()
{
label.setText(Integer.toString(x));
}
//constructor
public FirstController() {
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
這是我的SecondController
:
public class SecondController {
@FXML
private TextField testArea;
private FirstController firstController;
private int localX;
//constructor
public SecondController() {
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("First.fxml"));
try
{
loader.load();
firstController = loader.getController();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void startSecondController(Stage stage)
{
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("Second.fxml"));
try
{
Pane pane = loader.load();
Scene scene = new Scene(pane, 300, 300);
stage.setTitle("Second Window");
stage.setScene(scene);
stage.show();
}
catch (IOException e)
{
e.printStackTrace();
}
}
@FXML
void click(ActionEvent event) {
localX = Integer.parseInt(testArea.getText());
firstController.setX(localX);
}
@FXML
public void initialize()
{
localX = firstController.getX();
testArea.setText(Integer.toString(localX));
}
}
我認為描述這個問題足以理解這一點。 有誰能給我榜樣如何實現我的目標?
我對@James_D所說的內容進行了很多思考,我已經完成了代碼。 這就是控制器之間可以相互通信的結果: FirstController
class:
public class FirstController {
private IntegerProperty x = new SimpleIntegerProperty();
SecondController secondController;
@FXML
private Label label;
@FXML
void click(ActionEvent event) {
Stage stage = new Stage();
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("Second.fxml"));
try
{
Pane pane = loader.load();
secondController = loader.getController();
secondController.setLocalX(x.getValue());
secondController.setFirstController(this);
Scene scene = new Scene(pane, 300, 300);
stage.setTitle("Second Window");
stage.setScene(scene);
stage.show();
}
catch (IOException e)
{
e.printStackTrace();
}
}
@FXML
public void initialize()
{
label.setText(Integer.toString(x.getValue()));
x.addListener( observable -> {
label.setText(Integer.toString(x.getValue()));
});
}
//constructor
public FirstController() {
x.set(5);
}
public int getX() {
return x.getValue();
}
public void setX(int x) {
this.x.set(x);
}
}
然后SecondController
從FirstController
更改x
值:
public class SecondController {
@FXML
private TextField testArea;
private FirstController firstController;
private int localX;
public void setFirstController(FirstController firstController) {
this.firstController = firstController;
}
public void setLocalX(int x)
{
localX = x;
testArea.setText(Integer.toString(localX));
}
@FXML
void click(ActionEvent event) {
localX = Integer.parseInt(testArea.getText());
firstController.setX(localX);
}
@FXML
public void initialize()
{
testArea.setText(Integer.toString(localX));
}
}
這樣好嗎? 還是更好地嘗試通過afterburner.fx
框架使用注入?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.