【问题标题】:JavaFx : How to tell my main class to do something from my controller?JavaFx:如何告诉我的主类从我的控制器做某事?
【发布时间】:2016-12-17 20:48:23
【问题描述】:

我正在尝试构建我的第一个程序,但在 javaFX 控制器和我的主应用程序类之间进行通信时遇到了问题。

程序是一个倒计时:你输入小时和分钟的数字,倒计时结束时它会弹出一个窗口。

这是我的主控制器的 buttonClicked 函数:

@FXML
private TextField heure;
@FXML
private TextField minute;
@FXML
private Button launchButton;
private String hour,minutes;

public void launchButtonClicked(){
    hour = heure.getText();
    minutes = minute.getText();

    try {
          int h = Integer.parseInt(hour);
          int m = Integer.parseInt(minutes);

          System.out.println("MenuController");


    } catch (NumberFormatException e) {
          //Will Throw exception!
          //do something! anything to handle the exception.
    }

}

这是主要的课程:

public class Main extends Application {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);


@Override
public void start(Stage primaryStage) {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Menu.fxml"));
        Parent root = loader.load();
        Scene scene = new Scene(root,800,500);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

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

public void rappel(int h,int m){
    System.out.println("Rappel" + h + m);
    int minute = (h*60 + m) - 5;        
    final Runnable rappel = new Runnable(){
        public void run(){
            AlertBox box = new AlertBox();
            box.display("Reminder","Rappel : 5 min");
        }
    };

    final ScheduledFuture<?> rappelHandle = scheduler.schedule(rappel, minute, TimeUnit.MINUTES);
    scheduler.schedule(new Runnable() {
        public void run() { rappelHandle.cancel(true); }
    }, 60 * 60, TimeUnit.SECONDS);
}
}

我想要做的是,当单击启动按钮时,告诉我的主函数使用 rappel(int h,int m) 函数。它会启动一个显示我想要的字符串的警报框。

我觉得我没有正确使用控制器,因为我没有找到从我的控制器向我的主应用程序类“下达命令”的方法。

您对这如何工作有任何想法吗?我应该使用其他方式来弹出警报框而不是 scheduleexecutorservice 吗?

Ps:我还没有费心编写测试和异常处理。我保证当我设法让它工作时我会做的!

【问题讨论】:

  • 如果使用主类,使用 FXML 有什么意义? FXML 的目的是将图形与程序的逻辑分开。使用您的控制器!
  • “new Main().rappel(int, int,)”怎么样?
  • 是否有理由不将rappel(...) 方法移至控制器?无论如何,这似乎是一个更自然的地方。
  • 如果您需要从许多控制器或其他代码中调用 rappel()?我想这里的 main 只是一个学习东西的存根,在现实生活中,各种组件需要在它们之间进行通信。在 main 中将组件连接在一起是简单程序的有效设计。 FXML 和控制器在这里正是服务于这个目的 - 将绳索逻辑与控制器分开,这个问题确实有意义。控制器应该对 rappel 一无所知,但应该在执行控制器操作时调用 rappel() - 一个经典案例。

标签: java javafx javafx-8 scheduledexecutorservice


【解决方案1】:

在组件之间进行通信的一种简单方法是将侦听器属性添加到控制器类并从 main 添加一个侦听器。

请注意,有更简洁的方法可以将 JavFX 连接在一起,具体取决于程序需要,但我不会在这里讨论,因为它取决于并且有足够的关于设计模式的教程。这是一种回答编程问题的方法,足以运行您的程序:

在控制器中

class YourControllerClass{
...
    Runnable launchListener;

    public void setLaunchListener(Runnable launchListener){
        this.launchListener = launchListener;
    }
...

主要:

...
controller = (YourControllerClass) loader
                        .getController();
controller.setLaunchListener(() -> {
                    rappel(1,2)
                });

我在这里使用了 Runnable,因为它是内置的。如果您需要从控制器传递参数,请定义一个接口并使用它来代替 Runnable:

在控制器中

class YourControllerClass{
...
  public static interface ILaunchListener{
    public void onLaunch(int h, int m);
  }

  ILaunchListener launchListener;

  public void setLaunchListener(ILaunchListener launchListener){
      this.launchListener = launchListener;
  }

  public void launchButtonClicked(){
    if(launchListener!=null){
        hour = heure.getText();
        minutes = minute.getText();

        try {
              int h = Integer.parseInt(hour);
              int m = Integer.parseInt(minutes);

              launchListener.onLaunch(h, m);


        } catch (NumberFormatException e) {
              //Will Throw exception!
              //do something! anything to handle the exception.
        }
    }
  }

...

主要:

...
controller = (YourControllerClass) loader
                        .getController();
controller.setLaunchListener((h, m) -> {
                    rappel(h,m)
                });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多