2017-10-31 11 views
0

新しいJavaFXステージ(ウィンドウと呼ぶ)を開く次のコードがあります。JavaFXがボタンをクリックして新しいステージ(ウィンドウ)を開くのを防ぐ

openAlertBox.setOnAction(e -> { 
     AlertBox alert = AlertBox.getInstance(); 
     alert.display("AlertBox","Cool"); 
}); 

今、私はすべてのクリックで新しいウィンドウを開くことからユーザーを防ぎたい(したがって、ユーザーがすでに別のクリックで、ウィンドウを開いた場合、ウィンドウがすでに開いているので、何も起こりません)

これは私です表示方法:

public void display(String title, String message) { 
    Stage window = new Stage(); 

    window.initModality(Modality.NONE); 
    window.setTitle(title); 
    window.setMinWidth(250); 

    Label label = new Label(); 
    label.setText(message); 

    VBox layout = new VBox(10); 
    layout.getChildren().addAll(label); 
    layout.setAlignment(Pos.CENTER); 
    //Display window and wait for it to be closed before returning 
    Scene scene = new Scene(layout); 
    window.setScene(scene); 
    window.showAndWait(); 
} 

どうすればいいですか?

+1

あなたは、それをモーダルにしたいしないでください、それが表示されている場合次に、あなただけ確認することができますいずれか他のウィンドウへのイベント? –

+0

いいえ、私は特に非ブロッキングモーダルである必要があります。ユーザーエクスペリエンスのために、毎回閉じる必要がないようにしたいからです。 – Omaja7

+0

OK、コード内のコメントを読んでいました。 –

答えて

1

毎回新しいウィンドウを作成するのではなく、1つのウィンドウを作成して再利用します。

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class ShowAndWaitNonModalTest extends Application { 

    private Stage alertWindow ; 

    @Override 
    public void start(Stage primaryStage) { 
     Button show = new Button("Show"); 

     alertWindow = new Stage(); 

     show.setOnAction(e -> { 
      if (! alertWindow.isShowing()) { 
       Button ok = new Button("OK"); 
       Scene scene = new Scene(new StackPane(ok), 250, 250); 
       alertWindow.setScene(scene); 
       ok.setOnAction(evt -> alertWindow.hide()); 
       alertWindow.showAndWait(); 
      } 
     }); 


     Scene scene = new Scene(new StackPane(show), 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

またはあなたはそれが表示されているときにそれを示してどのコントロール無効にすることができます:あなたがブロックして

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class ShowAndWaitNonModalTest extends Application { 

    private Stage alertWindow ; 

    @Override 
    public void start(Stage primaryStage) { 
     Button show = new Button("Show"); 

     alertWindow = new Stage(); 

     show.setOnAction(e -> { 
      Button ok = new Button("OK"); 
      Scene scene = new Scene(new StackPane(ok), 250, 250); 
      alertWindow.setScene(scene); 
      ok.setOnAction(evt -> alertWindow.hide()); 
      alertWindow.showAndWait(); 
     }); 

     show.disableProperty().bind(alertWindow.showingProperty()); 

     Scene scene = new Scene(new StackPane(show), 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

さて、働いているようです。ありがとうございました – Omaja7

関連する問題