通过调用Application中的方法从控制器切换场景

时间:2017-06-20 18:54:09

标签: java javafx fxml

我正在做一个项目,我必须根据用户输入切换场景。目前我有一个Gui-Class,它是一个应用程序并加载第一个fxml-File,它由MainController类启动:

public class MainController {


public MainController() {
    Application.launch(Gui.class);
}

}

Gui-Class:

public class Gui extends Application{

Stage primaryStage;


//I wanna ideally use this method to switch scenes
public void switchen(String nextScene) throws Exception
{
    Parent nextS;
    if(nextScene.equals("singleMenue"))
    {
        nextS = FXMLLoader.load(getClass().getResource("SingleMenue.fxml"));
        primaryStage.hide();
        primaryStage.setScene(new Scene(nextS, 900, 600));
        primaryStage.show()
    }

}


@Override
public void start(Stage primaryStage) throws Exception {

    this.primaryStage = primaryStage;
    Parent decisionScene = FXMLLoader.load(getClass().getResource("Decision.fxml"));
    primaryStage.setTitle("title");
    primaryStage.setScene(new Scene(decisionScene, 900, 600));
    primaryStage.show();

    }

我还为每个.fxml文件设置了一个不同的Controller类(这是第一个):

public class DecisionController {

@FXML 
private Button singleButton;

@FXML 
private Button multiButton;

public DecisionController() {

}

@FXML
private void buttonPressed(ActionEvent event) throws IOException
{

    if(event.getSource() == singleButton)
    {
        System.out.println("single");
        // I wanna somehow call switch("singleMenue"); here
    }
    else if(event.getSource() == multiButton)
    {
        System.out.println("multi");
    }

}
}

那么如何从Controller内部切换场景呢?

我试图通常使用MVC模式,但我不知道我的DecisionController-Object应该如何调用Gui-Application中的方法。我需要在这里进入一个正在运行的线程,对吗? 我也不知道如何将我的Gui-Instance转交给DecisionController,因为后者是从Decision.fxml初始化的。

我尝试的另一件事是直接从DecisionController切换场景:

@FXML
private void buttonPressed(ActionEvent event) throws IOException
{

    if(event.getSource() == singleButton)
    {
        System.out.println("single");

        Stage mainstage = (Stage) singleButton.getScene().getWindow();
        Parent singleScene = FXMLLoader.load(getClass().getResource("SingleMenue.fxml"));
        mainstage.setScene(new Scene(singleScene, 900, 600));

    }
    else if(event.getSource() == multiButton)
    {
        System.out.println("multi");
    }

}

这是可以理解的,因为无法从应用程序线程外部进行操作。

我对JavaFX& FXML所以我对程序结构的一般想法可能完全错误,也许这不是你的MVC。非常感谢任何反馈:)

0 个答案:

没有答案