使用javafx发送无通知的通知

时间:2014-11-11 21:53:24

标签: java user-interface javafx notifications

您可以像这样使用JavaFx发送桌面通知(需要jdk 8u20或更高版本):

package sample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import org.controlsfx.control.Notifications;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
//        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Button notifyButton = new Button("Notify");
        notifyButton.setOnAction(e -> {
            Notifications.create().title("Test").text("Test Notification!").showInformation();
        });
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(notifyButton, 100, 50));
        primaryStage.show();
    }


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

但是这种方式你必须创建一个主窗口(阶段),是否可以避免这种情况?我正在寻找一种方法来发送通知,比如在bash中使用zenity:大部分代码都是非gui,但是使用一些gui元素以非常基本的方式通知用户或与用户交互。

1 个答案:

答案 0 :(得分:6)

看起来ControlsFX通知需要现有的舞台。您可以创建隐藏的实用程序阶段。尝试这样的事情。

package sample;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import org.controlsfx.control.Notifications;

public class Main extends Application {

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


    public static void main(String[] args) {
        new JFXPanel();
        notifier("Good!", "It's working now!");
    }

    private static void notifier(String pTitle, String pMessage) {
        Platform.runLater(() -> {
                    Stage owner = new Stage(StageStyle.TRANSPARENT);
                    StackPane root = new StackPane();
                    root.setStyle("-fx-background-color: TRANSPARENT");
                    Scene scene = new Scene(root, 1, 1);
                    scene.setFill(Color.TRANSPARENT);
                    owner.setScene(scene);
                    owner.setWidth(1);
                    owner.setHeight(1);
                    owner.toBack();
                    owner.show();
                    Notifications.create().title(pTitle).text(pMessage).showInformation();
                }
        );
    }
}

new JFXPanel()初始化JavaFX线程,而不必扩展Application。您必须在调用Platform.runLater()之前调用此方法,否则您将获得线程异常。您只需要为整个应用程序调用一次。老实说,创建​​自己的通知阶段并直接显示它可能更好。创建一个像上面这样的舞台并放置自己的内容。您可以重用ControlsFX源中的一些样式。