2014-11-07 10 views
9

Ich bin neu in JavaFX und ich frage mich, ob es eine Entsprechung zu Android Toast gibt? Ich habe die Klasse Notification gesehen, aber es sieht nicht so aus, als ob sie nur in der Anwendung angezeigt werden kann. Ich fand auch, dass ich ein Timer Benutzer benutzen könnte und Schattierung von einem Label machen könnte, aber wenn es etwas Klasse gibt, würde ich besser sein!Android Toast entspricht in JavaFX

Danke!

Antwort

6

Versuchen Sie die dritte Partei ControlsFX Notifications or Notification Pane.

„Die NotificationPane Steuerung ermöglicht es Ihnen, Ihre Benutzer etwas zu benachrichtigen, ohne ihre unmittelbare Eingabe erforderlich (die Sie mit dem ControlsFX Dialogen API tun können). Die NotificationPane wird in und aus der Sicht animiert“

toast1

Benachrichtigungen "zeigt eine Benachrichtigung an die Benutzer an einer von neun Stellen auf dem Bildschirm ... Nach einer festgelegten Dauer wird die Benachrichtigung ausgeblendet."

toast2

19

Ich weiß, es ist eine lange Zeit gewesen, da Sie diesen Beitrag, aber ich habe gerade eine Android-wie Toast Nachricht für JavaFX, so dass ich es hier posten in dem Fall, dass jemand diese Art von Code benötigen .

import javafx.animation.KeyFrame; 
import javafx.animation.KeyValue; 
import javafx.animation.Timeline; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 
import javafx.util.Duration; 

public final class Toast 
{ 
    public static void makeText(Stage ownerStage, String toastMsg, int toastDelay, int fadeInDelay, int fadeOutDelay) 
    { 
     Stage toastStage=new Stage(); 
     toastStage.initOwner(ownerStage); 
     toastStage.setResizable(false); 
     toastStage.initStyle(StageStyle.TRANSPARENT); 

     Text text = new Text(toastMsg); 
     text.setFont(Font.font("Verdana", 40)); 
     text.setFill(Color.RED); 

     StackPane root = new StackPane(text); 
     root.setStyle("-fx-background-radius: 20; -fx-background-color: rgba(0, 0, 0, 0.2); -fx-padding: 50px;"); 
     root.setOpacity(0); 

     Scene scene = new Scene(root); 
     scene.setFill(Color.TRANSPARENT); 
     toastStage.setScene(scene); 
     toastStage.show(); 

     Timeline fadeInTimeline = new Timeline(); 
     KeyFrame fadeInKey1 = new KeyFrame(Duration.millis(fadeInDelay), new KeyValue (toastStage.getScene().getRoot().opacityProperty(), 1)); 
     fadeInTimeline.getKeyFrames().add(fadeInKey1); 
     fadeInTimeline.setOnFinished((ae) -> 
     { 
      new Thread(() -> { 
       try 
       { 
        Thread.sleep(toastDelay); 
       } 
       catch (InterruptedException e) 
       { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
        Timeline fadeOutTimeline = new Timeline(); 
        KeyFrame fadeOutKey1 = new KeyFrame(Duration.millis(fadeOutDelay), new KeyValue (toastStage.getScene().getRoot().opacityProperty(), 0)); 
        fadeOutTimeline.getKeyFrames().add(fadeOutKey1); 
        fadeOutTimeline.setOnFinished((aeb) -> toastStage.close()); 
        fadeOutTimeline.play(); 
      }).start(); 
     }); 
     fadeInTimeline.play(); 
    } 
} 

Sie können mit diesem Code einen Toast Nachricht von jeder Klasse machen:

String toastMsg = "some text..."; 
int toastMsgTime = 3500; //3.5 seconds 
int fadeInTime = 500; //0.5 seconds 
int fadeOutTime= 500; //0.5 seconds 
Toast.makeText(primarystage, toastMsg, toastMsgTime, fadeInTime, fadeOutTime); 
+0

Dies funktioniert wie beworben, so +1 von mir. Aber ich brauchte es am Ende nicht;) – Christian

+0

Guter Job Mann, diese Antwort sollte mehr Stimmen haben. – VAdaihiep

+0

Was ist "primaryStage"? –