2016-08-05 23 views
4

Ich möchte eine Warnung zwingen, über anderen Anwendungen zu sein. Warnungen scheinen eine setAlwaysOnTop-Funktion zu fehlen.JavaFX So bringen Sie Dialog/Alarm an die Vorderseite des Bildschirms

Ich habe diesen Beitrag gesehen: JavaFX 2.2 Stage always on top.

ich versucht habe:

  1. erstellen Sie eine neue Stufe und stage.setAlwaysOnTop (true), dann alert.initOwner (Bühne).
  2. Erstellen Sie eine neue Bühne und stage.initModality (Modality.APPLICATION_MODAL), dann alert.initOwner (Bühne).

Weiß jemand, wie man das erreicht?

Edit: Ich bin mit Java 8.

Lassen Sie sagen, ich habe Safari geöffnet, und es konzentriert wird. Ich möchte die Warnung an den oberen Bildschirmrand bringen, wenn ich die Funktion showAndWait() aufrufen möchte.

+0

Verwenden Sie also ein Fenster, das die Funktionalität hat und an Ihre Warnung anpassen – Elltz

Antwort

6

Sie könnten "stehlen" die DialogPane von einem Alert und zeigen es in einem Dienstprogramm Stage. Aus diesem Fenster können Sie die alwaysOnTop Eigenschaft die übliche Art und Weise festgelegt:

Alert alert = new Alert(Alert.AlertType.WARNING, "I Warn You!", ButtonType.OK, ButtonType.CANCEL); 
DialogPane root = alert.getDialogPane(); 

Stage dialogStage = new Stage(StageStyle.UTILITY); 

for (ButtonType buttonType : root.getButtonTypes()) { 
    ButtonBase button = (ButtonBase) root.lookupButton(buttonType); 
    button.setOnAction(evt -> { 
     root.setUserData(buttonType); 
     dialogStage.close(); 
    }); 
} 

// replace old scene root with placeholder to allow using root in other Scene 
root.getScene().setRoot(new Group()); 

root.setPadding(new Insets(10, 0, 10, 0)); 
Scene scene = new Scene(root); 

dialogStage.setScene(scene); 
dialogStage.initModality(Modality.APPLICATION_MODAL); 
dialogStage.setAlwaysOnTop(true); 
dialogStage.setResizable(false); 
dialogStage.showAndWait(); 
Optional<ButtonType> result = Optional.ofNullable((ButtonType) root.getUserData()); 
System.out.println("result: "+result.orElse(null)); 
+0

Das hat funktioniert !! Danke für die Hilfe. –

-1

versuchen diese

Alert a = new Alert(AlertType.ERROR); 
     a.setTitle("Title of alert"); 
     a.initStyle(StageStyle.UNDECORATED); 
     a.setContentText("details of message"); 
     a.showAndWait(); 

Sie diese Warnmeldung zwingen können, um dem Benutzer angezeigt, wenn einige etwas falsch passieren, zum Beispiel, wenn der Benutzer die Daten als Zeichenfolge eingeben und Daten als ganze Zahl annehmen. ich hoffe das hilft dir.

hinweis: ich denke, Alert ist verfügbar für javafx (jdk 1.8).

+0

Hat nicht funktioniert. Lass mich meine Frage klären. –

+0

stellen Sie sicher, dass Sie Ihre jdk und Java-Tools aktualisieren und importieren für die Warnung –

+0

Dies funktioniert nicht einmal mit einer aktualisierten jdk. 'javafx.scene.control.Alert' wird nicht automatisch zu 'alwaysOnTop', wenn die übergeordnete Stufe OnTop ist, es sei denn, Sie finden einen Weg dazu. –

-1

Ich liebe JavaFX, aber ich glaube nicht, dass es einen Weg für JavaFx gibt, um das zu erreichen, was Sie wollen. Ich denke, du solltest nur alte Java-Technologie verwenden.

Versuchen:

JOptionPane optionPane = new JOptionPane(); 
JDialog dialog = optionPane.createDialog("Title"); 
dialog.setAlwaysOnTop(true); 
dialog.setVisible(true);    
11
Alert alert = new Alert(Alert.AlertType.WARNING, "I Warn You!", ButtonType.OK, ButtonType.CANCEL); 

Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); 
stage.setAlwaysOnTop(true); 
stage.toFront(); // not sure if necessary 
+0

Funktioniert auch ohne 'stage.toFront();'. –

+0

Danke. Funktioniert super! – Kefirchiks

+0

Zuerst habe ich es ohne stage.toFront() versucht; und es hat nicht funktioniert. Dann habe ich es mit stage.toFront() versucht und es hat funktioniert! Vielen Dank für diese Lösung! Danach habe ich gesehen, dass ich vergessen habe alert.initOwner (App.getPrimaryStage()) aufzurufen; und das verursachte den Fehler in meinem Fall. – MINDoSOFT

1

Ich habe Fabians und claimoars versucht, Lösungen und vereinfacht sie:

((Stage) dialog.getDialogPane().getScene().getWindow()).setAlwaysOnTop(true); 

Das in meine Eclipse-Werke/JavaFX App .