【问题标题】:Access to Javafx elements from another class without FXML不使用 FXML 从另一个类访问 Javafx 元素
【发布时间】:2019-02-14 12:43:19
【问题描述】:

我正在使用 Javafx8,可以说我创建了许多 ui 项目(如按钮等......)。我认为将这些按钮的所有 EventHandler 放入一个单独的类中是个好主意。我的问题是:如何从 EventHandler 访问任何按钮,例如禁用它或以任何其他方式操纵它。

这是一个带有两个按钮和一个用于 EventHandlers 的单独类的最小示例

假设这是我的 Start 课程:

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
            }
        };
    }
}

谢谢

【问题讨论】:

  • 恐怕你想错了;这是一个可怕的想法。随着您的应用程序变得越来越复杂,这将是一场噩梦。 EventHandlers 应该与控制其场景的类保持在同一个类中......
  • 在不相关的注释上,您可以考虑使用RadioButtonToggleButton 来处理您的情况,因为您基本上想在两个选项之间切换,并且一次只允许选择一个。
  • 我不完全同意这种说法,因为将事件放入控制器并将视图放入(在 javafx 情况下为 fxml 文件)有点像 MVC 的想法。这种分离并不总是很好,因为有些东西 fxml 只是普通的不支持。基本上,我不相信他有一个天生的坏主意。只是执行得不好。
  • 我刚刚创建了一个带有两个按钮的简单示例。实际上,它是一个拥有超过 30 个按钮和所有其他东西的应用程序。这意味着,我在同一个类中拥有所有 Eventhandler 实现。这个班级像地狱一样长大。这就是为什么我想创建一个单独的类。但是后来我遇到了访问这些对象的问题。我可以问不同的问题:对于这些情况,什么是“最佳实践”:使用严格的 MVC 模式或将所有事件处理程序放在一个类中?

标签: java javafx eventhandler


【解决方案1】:

所以根据你的委托人。您希望禁用位于 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);
        }
    };
}

}

【讨论】:

  • 非常感谢,我可以这么简单。我会根据我的目的对其进行调整。
  • 顺便说一句,我有一个下一个问题:如何使用 EventHandler 的 MenuItem 访问这些按钮?父级应该是 MenuItem menuitem = (MenuItem) t.getSource();菜单 m = (菜单) menuitem.getParentMenu();我怎样才能得到这个 ui-component-tree 的“根”?
猜你喜欢
  • 1970-01-01
  • 2017-12-02
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 2015-04-06
相关资源
最近更新 更多