Как прикрепить обработчики событий к контроллеру в MVC | JavaFX - PullRequest
1 голос
/ 28 апреля 2019

У меня проблемы с пониманием того, как применить шаблон mvc с JavaFX.

Вот мои вопросы относительно кода ниже, так как мне нужно следовать шаблону, приведенному в коде:

a) Как я могу прикрепить обработчик события кнопки, присутствующей в моем ViewA, к коду в моем ControllerA (в частности, метод attachEventHandlers()). Например, я хочу, чтобы моя кнопка заполняла comboBox в ViewA результатами метода getModelItems() из контроллера.

Обратите внимание, что метод getModelItems() является приватным.

б) У меня будет несколько кнопок и обработчиков событий. Как я буду связывать каждого из них уникально с контроллером?

c) Я хочу вызвать setName(String name) для моей модели в контроллере, и параметр, который я хочу передать, является выбранным значением в комбинированном окне в viewA. Как мне этого добиться?

Большое спасибо за любую помощь!

Ниже приведен код, указанный в описании.

Контроллер:

import model.ModelA;
import view.ViewA;
public class ControllerA {

    private ViewA view;

    private ModelA model;

    public ControllerA(ViewA view, ModelA model) {
        //initialise model and view fields
        this.model = model;
        this.view = view;

        //populate combobox in ViewB, e.g. if viewB represented your ViewB you could invoke the line below
        //viewB.populateComboBoxWithCourses(setupAndRetrieveCourses());

        this.attachEventHandlers(); 

    }

    private void attachEventHandlers() {
    }


    private String[] getModelItems() {

        String[] it = new String[2];
        it[0] = "0";
        it[1] = "1";

        return it;
    }

}

Модель:

public class ModelA {

    private String name;


    public Name() {
        name = "";
    }



    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Name = " + name;
    }

}

Вид:

import javafx.scene.layout.BorderPane;

//You may change this class to extend another type if you wish
public class ViewA extends BorderPane {
    public BorderPane bp;

    public ViewA(){
        this.bp = new BorderPane();
        ComboBox comboBox = new ComboBox();
        Button button1 = new Button("Populate");
        bp.setTop(button1);
        bp.setBottom(comboBox);

    }
}

Loader:

public class ApplicationLoader extends Application {

    private ViewA view;

    @Override
    public void init() {
        //create model and view and pass their references to the controller
        ModelA model = new ModelA();
        view = new ViewA();
        new ControllerA(view, model);   
    }

    @Override
    public void start(Stage stage) throws Exception {
        //whilst you can set a min width and height (example shown below) for the stage window,
        //you should not set a max width or height and the application should
        //be able to be maximised to fill the screen and ideally behave sensibly when resized
        stage.setMinWidth(530); 
        stage.setMinHeight(500);


        stage.setTitle("Final Year Module Chooser Tool");
        stage.setScene(new Scene(view));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

1 Ответ

0 голосов
/ 30 апреля 2019

Вы добавляете делегатов в свой ViewA, чтобы разрешить доступ:

public class ViewA extends BorderPane {
    ComboBox comboBox;
    Button button1;

    public ViewA(){
        comboBox = new ComboBox();
        button1 = new Button("Populate");
        setTop(button1);
        setBottom(comboBox);
    }

    // Add delegates for all functionality you want to make available through ViewA
    public ObservableList<String> getItems() { return comboBox.getItems(); }
    public void setOnButton1Action(...) { ... }
    public void setOnButton2Action(...) { ... }
    ...
}

Вы можете выбирать как можно больше или меньше, в зависимости от того, сколько вы хотите управлять с помощью ViewA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...