JavaFx:如何告诉我的主类从我的控制器做一些事情?

时间:2016-12-17 20:48:24

标签: java javafx javafx-8 scheduledexecutorservice

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

该计划是一个倒计时:您输入一个小时和分钟的数字,并在倒计时结束时启动一个弹出窗口。

这是我的主控制器的按钮点击功能:

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

我想要做的是,当点击launchButton时,告诉我的main函数使用rappel(int h,int m)函数。它将启动一个alertBox,显示我想要的字符串。

我觉得我没有正确使用控制器,因为我没有找到从我的控制器到#34;发出命令的方法&#34;到我的主应用程序类。

您对这如何运作有任何想法吗?我应该使用另一种方式来弹出一个警报器而不是scheduledexecutorservice吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

在控制器中

class YourControllerClass{
...
    Runnable launchListener;

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

在main中:

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

...

在main中:

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