2017-01-19 12 views
0

2つのボタンオプションでコンピュータをサスペンドするかどうかを尋ねるウィンドウを表示するアプリケーションをビルドします。その1つがYESで、PCがサスペンドします。hideとshowのJavaFXステージの問題

"Later"という名前のもう1つのボタンは、ウィンドウを非表示にし、1時間後に再び表示され、同じ質問をします。

コード「以降のbuttton」

noButton.setOnAction(event -> { 


     Done=false; //boolean to close and open the frame 
     Gui gui = new Gui(); 

      try { 
       gui.start(classStage); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     }); 

あなたがコードで表示さboolean型は、それは私がそれを制御することができると思う方法だったBC、私はさまざまな方法で試みたが、誰もちょうど私を信頼しているため問題を手伝ってください。ここにGUIクラスのコードがあります。

public class Gui extends Application { 

public Stage classStage = new Stage(); 

public static boolean Done=true; 

public static boolean flag=true; 


public Gui() { 


} 

@Override 
public void start(Stage primaryStage) throws Exception { 

    Done = Controller.isDone(); 
    classStage = primaryStage; 


    Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds(); 
    primaryStage.setX(primaryScreenBounds.getMaxX() - primaryScreenBounds.getWidth()); 
    primaryStage.setY(primaryScreenBounds.getMaxY() - primaryScreenBounds.getHeight()); 
    primaryStage.setAlwaysOnTop(true); 
    Parent root = FXMLLoader.load(getClass().getResource("MainWindow.fxml")); 
    primaryStage.setTitle("Alerta suspencion de equipo"); 
    primaryStage.setScene(new Scene(root)); 
    primaryStage.setResizable(false); 
    primaryStage.initStyle(StageStyle.UNDECORATED); 

    if (Controller.isDone() == true) { 
     primaryStage.show(); 

    } else if(Controller.isDone() == false) { 
     primaryStage.hide(); 
     Platform.exit(); // this is the only way that the windows close 


    } 
} 

私はPlatform.exit()をよく知っています。プログラムを殺しますが、私は.hide()を使うだけです。何も起こらず、ウィンドウは決して閉じられませんでした。最悪の部分は、私がPlatform.exit()コマンドを使用すると、フレームが再び表示されることがないということです...

誰でも簡単に隠して表示する方法がわかりますある時間の後の窓?多分私はこれを間違っている。

よろしくお願いいたします。

+0

「スレッド」または「一時停止」を使用できます。 2番目の方法が推奨されます。 – GOXR3PLUS

+0

なぜ 'Application'サブクラスをインスタンス化していますか? JavaFXアプリケーションがすでに実行されているので、おそらく別の 'Application'サブクラスをすでに持っているでしょう。 JavaFXプログラムには1つの 'Application'インスタンスしか存在しません.FXアプリケーションを起動すると、あなたのために作成されたインスタンスでなければなりません。 –

+0

'classStage.hide()'がうまくいかない理由は明らかではありません。あなたが投稿したコードとは無関係です。問題を再現する[MCVE]を作成し、質問を組み込むために質問を編集します。あなたが記述した機能(2つのボタンなど)を使って、数十行のコードで完全な例を書くことができます。ここでの質問は、許容範囲内です。 –

答えて

2

あなたの質問のコードで何が起こっているのかは分かりません。要するに、自分自身でApplicationのインスタンスを作成しないでください。唯一のApplicationインスタンスが作成されます。

私が実際に表示した機能のための別のクラスを持つ必要はありません(もちろん可能ですが)。最後のウィンドウが閉じている場合FXアプリケーションは、デフォルトでは、終了すること

noButton.setOnAction(event -> { 


    Done=false; //boolean to close and open the frame 

    classStage.hide(); 
    PauseTransition oneHourPause = new PauseTransition(Duration.hours(1)); 
    oneHourPause.setOnFinished(e -> showUI(classStage)); 
    oneHourPause.play(); 
}); 

// ... 

private void showUI(Stage stage) { 

    Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds(); 
    stage.setX(primaryScreenBounds.getMaxX() - primaryScreenBounds.getWidth()); 
    stage.setY(primaryScreenBounds.getMaxY() - primaryScreenBounds.getHeight()); 
    stage.setAlwaysOnTop(true); 
    Parent root = FXMLLoader.load(getClass().getResource("MainWindow.fxml")); 
    stage.setTitle("Alerta suspencion de equipo"); 
    stage.setScene(new Scene(root)); 
    stage.setResizable(false); 
    stage.initStyle(StageStyle.UNDECORATED); 
    stage.show(); 
} 

注:あなたがやらなければならないことは、何のボタンが押されていない、と時間で再びそれを開いている場合はclassStageを隠していますしたがって、init()またはstart()メソッドでPlatform.setImplicitExit(false);に電話する必要があります。

以前にロードされて以来UIが変更されている可能性があるので、FXMLファイルをリロードしているとします。明らかにそうでない場合は、そのままステージを表示するだけです。

noButton.setOnAction(event -> { 


    Done=false; //boolean to close and open the frame 

    classStage.hide(); 
    PauseTransition oneHourPause = new PauseTransition(Duration.hours(1)); 
    oneHourPause.setOnFinished(e -> classStage.show()); 
    oneHourPause.play(); 
}); 
+0

実際に最大の問題の1つは、classStage.hideメソッドが機能しないことです。ステージは隠れることはありません。 –

+0

@ChristopherAngelあなたのコードでは、あなたが投稿したものと本質的に別の何かが間違っています。 –