【发布时间】: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