Как реализовать EventHandler <ActionEvent>в отдельном классе для более чем одной кнопки? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь создать отдельный файл класса для моих обработчиков событий, потому что сейчас у меня те же 6 строк кода с небольшими изменениями чисел.Это много повторяющегося кода, и я не уверен, как его обработать.

public class GUIDemo extends Application
{
    private Button btn1 = new Button("Button 1");
    private Button btn2 = new Button("Button 2");
    private Button btn3 = new Button("Button 3");
    private Button btn4 = new Button("Button 4");
    private Button btn5 = new Button("Button 5");
    private Button btn6 = new Button("Button 6");
    private Label lbl1 = new Label();
    private Label lbl2 = new Label();
    private Label lbl3 = new Label();
    private Label lbl4 = new Label();
    private Label lbl5 = new Label();
    private Label lbl6 = new Label();

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        GridPane myPane = new GridPane();
        myPane.setHgap(10);
        myPane.setVgap(10);
        Scene myScene = new Scene(myPane, 500, 300);
        primaryStage.setScene(myScene);
        primaryStage.show();

        primaryStage.setTitle("GUI Demo");

        myPane.setAlignment(Pos.CENTER);

        myPane.add(btn1, 0, 1);
        myPane.add(btn2, 1, 1);
        myPane.add(btn3, 2, 1);
        myPane.add(btn4, 0, 3);
        myPane.add(btn5, 1, 3);
        myPane.add(btn6, 2, 3);

        myPane.add(lbl1, 0, 2);
        myPane.add(lbl2, 1, 2);
        myPane.add(lbl3, 2, 2);
        myPane.add(lbl4, 0, 4);
        myPane.add(lbl5, 1, 4);
        myPane.add(lbl6, 2, 4);

        btn1.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                System.out.println("Button 1 clicked");
                lbl1.setText("Button 1 clicked");
            }
        });
        btn2.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                System.out.println("Button 2 clicked");
                lbl2.setText("Button 2 clicked");
            }
        });
        btn3.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                System.out.println("Button 3 clicked");
                lbl3.setText("Button 3 clicked");
            }
        });
        btn4.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                System.out.println("Button 4 clicked");
                lbl4.setText("Button 4 clicked");
            }
        });
        btn5.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                System.out.println("Button 5 clicked");
                lbl5.setText("Button 5 clicked");
            }
        });
        btn6.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                System.out.println("Button 6 clicked");
                lbl6.setText("Button 6 clicked");
            }
        });
    }

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

Я пробовал следующее (не реализовано в коде выше), но он не работает.Он не печатает «Кнопка нажата» на консоли.Мне также нужно иметь возможность печатать «Button # clicked», потому что результат должен быть разным для всех шести кнопок.

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class ButtonHandler implements EventHandler<ActionEvent>
{
    private final Stage window;
    private final Scene scene;

    ButtonHandler(Stage window, Scene scene)
    {
        this.window = window;
        this.scene = scene;
    }

    @Override
    public void handle(ActionEvent e) {
        System.out.println("Button clicked");
        window.setScene(scene);
    }   
}

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Сначала проанализируйте, к каким данным необходим доступ обработчику событий.

В этом случае это:

  • номер кнопки
  • метка

Это означает, что вы можете просто создать класс, содержащий поле int:

public class ButtonHandler implements EventHandler<ActionEvent> {
    private final String text;
    private final Label label;

    public ButtonHandler(int number, Label label) {
        this.text = "Button " + number + " clicked";
        this.label = label;
    }

    @Override
    public void handle(ActionEvent e) {
        System.out.println(text);
        label.setText(text);
    }
}
btn1.setOnAction(new ButtonHandler(1, lbl1));
0 голосов
/ 14 февраля 2019

Вы можете создать метод, который возвращает объект-обработчик и принимает String (текст или просто кнопку NO)

private  EventHandler <ActionEvent> getHandler (String str)
{
    return new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent event) {
            Button b = ((Button)event.getSource());
            b.setText(b.getText()+"have been clicked");
            System.out.print(str);
        }

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