Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaFX和MVC中处理控制器中的事件(不是FXML)_Java_Model View Controller_Javafx_Event Handling_Eventhandler - Fatal编程技术网

在JavaFX和MVC中处理控制器中的事件(不是FXML)

在JavaFX和MVC中处理控制器中的事件(不是FXML),java,model-view-controller,javafx,event-handling,eventhandler,Java,Model View Controller,Javafx,Event Handling,Eventhandler,我现在正在学习JavaFx和MVC,我正在尝试通过控制器将我的按钮连接到模型。我尝试了很多方法来使用button.setOnActive(EventHandler e) 但它在view类之外不起作用 那么正确的方法是什么呢 这是我的观点课 public class View extends Application{ private TextField num1; private Label addLabel; private TextField num2;; public Button ca

我现在正在学习JavaFx和MVC,我正在尝试通过控制器将我的按钮连接到模型。我尝试了很多方法来使用
button.setOnActive(EventHandler e)
但它在view类之外不起作用
那么正确的方法是什么呢

这是我的观点课

public class View extends Application{


private TextField num1;
private Label addLabel;
private TextField num2;;
public Button calcB;
private TextField sol;

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Calculator");

    num1 = new TextField();
    addLabel = new Label("+");
    num2 = new TextField();

    calcB = new Button("Calculate");


    **// I'm trying to use this in the Controller
    calcB.setOnAction(event -> System.exit(0));**

    sol = new TextField();

    FlowPane flowPane = new FlowPane();
    flowPane.getChildren().addAll(num1, addLabel, num2, calcB, sol);

    Scene scene = new Scene(flowPane, 600, 200);
    primaryStage.setScene(scene);
    primaryStage.show();


}

public int getNum1(){
    return Integer.parseInt(num1.getText());
}

public int getNum2(){
    return Integer.parseInt(num2.getText());
}

public void setSol(int sol){
    this.sol.setText(Integer.toString(sol));
}
这是我的控制器类

public class Controller{


private View  theView;
private Model theModel;

public Controller(Button b, EventHandler<ActionEvent> e) {
    this.theView = theView;
    this.theModel = theModel;

    **//SetOnActive() method should be somewhere in this Class**

}
}

这也是我的主要任务

public class Main {
public static void main(String[] args){
    View view = new View();
    Model model = new Model();
    Controller controller = new Controller(view, model);

    Application.launch(View.class, args);
}

使用下面的代码创建一个包含ControllerA、ControllerB、Driver、ViewA和ViewB类的空白项目,然后从Driver类中的main方法运行代码

这将有望向您展示控制器如何处理事件

司机: 控制器: 视图A: 控制员B: 视图B:
使用下面的代码创建一个包含ControllerA、ControllerB、Driver、ViewA和ViewB类的空白项目,然后从Driver类中的main方法运行代码

这将有望向您展示控制器如何处理事件

司机: 控制器: 视图A: 控制员B: 视图B:

将视图类作为
应用程序的子类是没有意义的
当您从未创建元素时,您如何期望您的控制器能够实际控制元素?像这样,您的
Controller
类不应该以任何方式支持。应用程序和控制器之间没有连接。这就是FXML在引擎盖下非常方便的工作。我是新手。不是像swing一样,每当你想做gui的时候,你就应该继承JFrame吗?我添加了我的主要方法,你现在可以看看吗?我知道fxml更好,但我现在不想使用它,所以,有什么方法可以让它工作吗?我看到它在swing中工作,但在javafx中不工作。视图类作为
应用程序的子类是没有意义的
当您从未创建元素时,您如何期望您的控制器能够实际控制元素?像这样,您的
Controller
类不应该以任何方式支持。应用程序和控制器之间没有连接。这就是FXML在引擎盖下非常方便的工作。我是新手。不是像swing一样,每当你想做gui的时候,你就应该继承JFrame吗?我添加了我的主要方法,你现在可以看看吗?我知道fxml更好,但我现在不想使用它,所以,有什么方法可以让它工作吗?我看到它在swing中工作,但不是javafx。谢谢,实际上这使它更清晰。我有一些问题。谢谢,实际上这使它更清晰。我有一些问题。如果我有更多的事件要处理,我能不能用lambda之类的东西让它更清楚?我应该只为方法创建另一个类吗?如果我有不止一个场景,并且想要在它们之间切换,我可以在哪里切换呢?我已经更新了我的帖子,包括使用lambda和切换场景的示例。你不需要为处理方法(你是说事件吗?)创建单独的类,因为这是控制器的核心目的。我想要一个菜单用于整个应用程序,另一个左菜单用于更改中心的视图。我还有一个问题,也许能让你明白我想要什么。另外,请看这张图片,问题是关于MVC的。对于像我这样的傻瓜来说,可以通过添加一个模型来改进答案。谢谢,谢谢,实际上这让它更清晰了买我有一些问题谢谢,实际上这让它更清晰了买我有一些问题。如果我有更多的事件要处理,我能不能用lambda之类的东西让它更清楚?我应该只为方法创建另一个类吗?如果我有不止一个场景,并且想要在它们之间切换,我可以在哪里切换呢?我已经更新了我的帖子,包括使用lambda和切换场景的示例。你不需要为处理方法(你是说事件吗?)创建单独的类,因为这是控制器的核心目的。我想要一个菜单用于整个应用程序,另一个左菜单用于更改中心的视图。我还有一个问题,也许能让你明白我想要什么。另外,请看这张图片,问题是关于MVC的。对于像我这样的傻瓜来说,可以通过添加一个模型来改进答案。谢谢
public class Main {
public static void main(String[] args){
    View view = new View();
    Model model = new Model();
    Controller controller = new Controller(view, model);

    Application.launch(View.class, args);
}
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Driver extends Application {
    public static void main(final String[] args) {
        launch();
    }

    @Override
    public void init() {}

    @Override
    public void start(final Stage primaryStage) throws Exception {
        final Scene scene = new Scene(new ControllerA(primaryStage).getView());
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class ControllerA implements EventHandler {
    private final Stage primaryStage;
    private final ViewA view = new ViewA(this);

    public ControllerA(final Stage primaryStage) {
        this.primaryStage = primaryStage;
    }

    @Override
    public void handle(final Event event) {
        final Object source = event.getSource();

        if (source.equals(view.getButton())) {
            System.out.println("ButtonA has been pressed, switching to ViewB.");

            final ControllerB controllerB = new ControllerB(primaryStage);
            final Scene scene = new Scene(controllerB.getView());
            primaryStage.setScene(scene);
        }
    }

    public Stage getPrimaryStage() {
        return primaryStage;
    }

    public ViewA getView() {
        return view;
    }
}
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;

public class ViewA extends HBox {
    private final Button button = new Button("ButtonA");

    public ViewA(final ControllerA controllerA) {
        button.setOnAction(controllerA);
        this.getChildren().addAll(button);
    }

    public Button getButton() {
        return button;
    }
}
import javafx.stage.Stage;

public class ControllerB {
    private final Stage primaryStage;
    private final ViewB view = new ViewB(this);

    public ControllerB(final Stage primaryStage) {
        this.primaryStage = primaryStage;
    }

    public Stage getPrimaryStage() {
        return primaryStage;
    }

    public ViewB getView() {
        return view;
    }
}
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class ViewB extends HBox {
    private final Button button = new Button("ButtonB");

    public ViewB(final ControllerB controllerB) {
        button.setOnAction(event -> {
            System.out.println("ButtonB has been pressed, switching to ViewA.");

            final Stage primaryStage = controllerB.getPrimaryStage();
            final ControllerA controllerA = new ControllerA(primaryStage);
            final Scene scene = new Scene(controllerA.getView());
            primaryStage.setScene(scene);
        });
        this.getChildren().addAll(button);
    }

    public Button getButton() {
        return button;
    }
}