2016-09-08 10 views
2

Erstellt eine Vollbildanwendung mit einem Popup-Fenster, das sich öffnet, wenn die ESCAPE-Taste gedrückt wird. Einmal gestartet, blinkt die Anwendung und zeigt das Popup-Fenster an.Programm blinkt beim Öffnen des Popup-Fensters

//Pop-up window 
    Stage window = new Stage(); 
    window.initModality(Modality.NONE); 
    //Exit Panel 
    VBox exitBox = new VBox(); 
    exitBox.setPadding(new Insets(10)); 
    Button exitPaneExit = new Button(); 
    exitPaneExit.setText("Return"); 
    exitPaneExit.setMinSize(75.0, 30.0); 
    exitPaneExit.setOnAction(e -> { 
     window.close(); 
    }); 
    Button exitButton = new Button(); 
    exitButton.setText("Exit"); 
    exitButton.setMinSize(75.0, 30.0); 
    exitButton.setOnAction(e -> { 
     System.exit(0); 
    }); 
    exitBox.getChildren().addAll(exitPaneExit,exitButton); 
    exitBox.setVisible(true); 
    Scene scene = new Scene(exitBox); 
    window.initStyle(StageStyle.UNDECORATED); 
    window.initOwner(primaryStage); 
    window.setScene(scene); 
    mapScene.setOnKeyPressed(e -> { 
     if(e.getCode()==KeyCode.ESCAPE) 
     { 
      window.show(); 
     } 
    }); 

Der Code läuft gut und ich bekomme keine Fehler, aber die Anwendung blinkt beim Öffnen des PopUp das QUITE nervig ist.

+0

Einige Details der 'mapScene' würden helfen. Wenn Sie nicht bereit sind, den Code von 'mapScene' zu ​​posten, hat er dann einen dunklen Hintergrund? Füllen Sie den Hintergrund mit einer Farbe in dieser Szene? Welche JDK-Version verwenden Sie? – iMan

+0

Die gesamte mapScene enthält ein ImageView, das mit einem AnchorPane in die obere linke Ecke gesetzt wird. Da das Bild eher klein ist, ist der Rest der Scheibe derzeit ein wenig dunkelweiß. Wie für JDK verwende ich 1.8. –

Antwort

0

Endlich fand ich die Lösung selbst durch die Implementierung der Popup-Klasse. Dies ist der gleiche Effekt wie die Erstellung einer transparenten/Utility-Stufe mit einem initOwner, ist aber in JavaFX integriert. Wenn es gezeigt wird, benötigt es einen initOwner, so dass das Argument, das ich dort platziert habe. Hier

ist der Code:

Der Code, die für die tatsächliche Popup.

private Popup addExitPopup(){ 
    Popup exitPopup = new Popup(); 
    //Exit Panel 
    VBox exitBox = new VBox(); 
    exitBox.setPadding(new Insets(10)); 
    Button exitPaneExit = new Button(); 
    exitPaneExit.setText("Return"); 
    exitPaneExit.setMinSize(75.0, 30.0); 
    exitPaneExit.setOnAction(e -> { 
     exitPopup.hide(); 
    }); 
    Button exitButton = new Button(); 
    exitButton.setText("Exit"); 
    exitButton.setMinSize(75.0, 30.0); 
    exitButton.setOnAction(e -> { 
     System.exit(0); 
    }); 
    exitBox.getChildren().addAll(exitPaneExit,exitButton); 
    exitBox.setVisible(true); 

    exitPopup.setAutoHide(true); 
    exitPopup.getContent().add(exitBox); 
    return exitPopup; 
} 

Der Code relevant für die Darstellung in einer Vollbildanwendung.

@Override 
public void start(Stage primaryStage) throws Exception { 
    Popup exitPopupO = addExitPopup(); 
    AnchorPane mapAnchorO = addMapAnchor(); 
    Scene mapScene = new Scene(mapAnchorO); 
    primaryStage.setScene(mapScene); 
    primaryStage.setFullScreen(true); 
    primaryStage.setResizable(false); 
    primaryStage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH); 
    primaryStage.show(); 

    mapScene.setOnKeyPressed(e -> { 
     if(e.getCode()==KeyCode.ESCAPE) 
     { 
      exitPopupO.show(primaryStage); 
     } 
    }); 
} 
1

Warum müssen Sie eine andere Stufe erstellen? Können Sie nicht einen einfachen benutzerdefinierten Dialog wie diesen verwenden?

Dialog window = new Dialog(); 
window.setTitle("Your title"); 
window.setHeaderText("Your header"); 
window.setContentText("Your Content Text") 
window(Modality.APPLICATION_MODAL); 
window(mainStage); 
window(StageStyle.UTILITY); 
ButtonType btnReturn = new ButtonType("return"); 
ButtonType btnExit = new ButtonType("exit"); 
window.getDialogPane().getButtonTypes().addAll(btnReturn, btnExit); 
mapScene.setOnKeyPressed(e -> { 
    if(e.getCode()==KeyCode.ESCAPE){ 
     Optional<ButtonType> result = window.showAndWait(); 
     if (result.get() == btnExit){ 
      Platform.exit(); 
      System.exit(0); 
     } 
    } 
}); 

habe ich die Stufe von der Klasse mit dem Hauptverfahren an die Steuerung, so sollte es jede Ausnahme nicht erzeugen, wie folgt aus:

Hauptklasse:

public void start(Stage stage) throws Exception { 

    FXMLLoader loader = new FXMLLoader(getClass().getResource("ToolConfiguration.fxml")); 

    Parent root = (Parent)loader.load(); 

    ToolConfigurationController controller = loader.<ToolConfigurationController>getController(); 
    controller.setLanguage("en", stage); 

    notifier = Notification.Notifier.INSTANCE; 
    [...] 
} 

Es funktioniert gut für mich

und kommt, wie dies in der Controller-Klasse:

public void setLanguage(String language, Stage stage){ 
    this.mainStage = stage; 
    this.language=language; 

    locale = new Locale(language.toLowerCase(), language); 
    bundle = ResourceBundle.getBundle("smartDrawerTool.bundles.ToolConfiguration", locale); 
} 
+0

Auch nach dem Beheben aller Syntaxprobleme erzeugt dies den Flimmereffekt. – DVarga

+0

Nachdem die Syntaxfehler behoben wurden und die Anwendung ausgeführt wurde, wird eine nullPointerException zurückgegeben. Es ist behoben, wenn ich den window.initOwner (primaryStage) entferne; Linie, aber das vereitelt den Zweck völlig. –

+0

Ich habe die Antwort bearbeitet, um zu sehen, wie es für mich möglich ist – MaglioniLorenzo

Verwandte Themen