2016-12-17 9 views
0

私は最初のプログラムをビルドしようとしていますが、私はjavaFXコントローラとメインアプリケーションクラス間の通信に問題があります。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); 
} 
} 

何私は、launchButtonをクリックしたときに、使用することが私の主な機能を教えているやりたいですrappel(int h、int m)は機能します。それは私が望むStringを表示するalertBoxを起動します。

コントローラを正しく使用していないような気がします。コントローラからメインのアプリケーションクラスに「注文する」方法を見つけられなかったからです。

これがどのように機能するかについてご意見はありますか?私は、スケジュールされたexececutorserviceよりもアラートボックスをポップアップする別の方法を使用する必要がありますか?

Ps:私はまだテストと例外処理を書いていないと思います。私はそれがうまく動作するように管理するときに私は約束します!

+0

FXMLを使用してのポイントがあればどのようなものですメインクラスを使用していますか? FXMLの目的は、あなたのコントローラのロジックからグラフィックを分離することです。コントローラーを使用してください! –

+0

"新しいMain()。rappel(int、int、)"はどうですか? – creativecreatorormaybenot

+0

'rappel(...)'メソッドをコントローラに移動させない理由はありますか?とにかくそれはもっと自然な場所だと思われます。 –

答えて

0

components間で通信する簡単な方法の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) 
       }); 
関連する問題