Доступ к элементам Javafx из другого класса без FXML - PullRequest
0 голосов
/ 14 февраля 2019

Я использую Javafx8 и допустим, что я создал много элементов пользовательского интерфейса (например, кнопки и так далее ...).Я подумал, что хорошая идея поместить все EventHandler для этих кнопок в отдельный класс.Мой вопрос: как я могу получить доступ из EventHandler к любой кнопке, например, чтобы набрать ее или каким-либо другим способом манипулировать ею.

Вот минимальный пример с двумя кнопками и отдельным классом для EventHandlers

Допустим, это мой стартовый класс:

public class App extends Application
{
    @Override
    public void start(Stage primaryStage) throws Exception {
        Button b1 = new Button();
        b1.setOnAction(ListenerClass.createB1Event());
        Button b2 = new Button();
        b2.setOnAction(ListenerClass.createB2Event());

        VBox vbox = new VBox(b1, b2);

        Scene scene = new Scene(vbox, 200, 200);

        primaryStage.setTitle("App");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

И мой (отдельный) класс слушателей:

public class ListenerClass {

    public static EventHandler<ActionEvent> createB1Event() {
        return new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                //Access here to b1 and b2...
                //Deactivate B1
                //Activate B2
            }
        };
    }

    public static EventHandler<ActionEvent> createB2Event() {
        return new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                //Access here to b1 and b2...
                //Activate B1
                //Dectivate B2
            }
        };
    }
}

Спасибо

1 Ответ

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

Итак, исходя из вашего принципала.Вы хотите, чтобы кнопка, которая находится в vbox и была нажата, была отключена, а все остальные кнопки из этого vbox были включены.И ваша проблема в том, как найти кнопку, которая была нажата.

Вам нужно использовать метод ActionEvent.getSource ().

Вот как бы я ее кодировал ...

Это начальный класс:

public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
    VBox vbox = new VBox();
    Button b1 = addNewButton("Button1",vbox);
    Button b2 = addNewButton("Button2",vbox);
    Button b3 = addNewButton("Button3",vbox);


    Scene scene = new Scene(vbox, 200, 200);

    primaryStage.setTitle("App");
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static Button addNewButton(String label, VBox ownerVBox){
    Button button = new Button(label);
    ownerVBox.getChildren().add(button);
    button.setOnAction(ListenerClass.createBEvent());
    return button;
}


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

Класс слушателя:

public class ListenerClass {

public static EventHandler<ActionEvent> createBEvent() {
    return new EventHandler<ActionEvent>() {
        public void handle(ActionEvent t) {
            Button b = (Button) t.getSource();
            VBox vbox =(VBox) b.getParent();
            vbox.getChildren().forEach(button-> {
                button.setDisable(false);
            });
            b.setDisable(true);
        }
    };
}

}
...