ЗадачаКак создать всплывающее уведомление, которое является прозрачным для мыши?
Я хотел бы создать окно уведомления, которое мышь прозрачна на сцену и на рабочем столе.
Проблема
Всплывающее не имеет функции mousetransparent. Когда всплывающее окно отображается, вам нужно подождать, пока он не исчезнет, чтобы получить доступ к содержащемуся в нем содержимому.
Вопрос
Можно создавать уведомления всплывающие окна (или другие окна), которые имеют механизм клику? Он должен работать для всплывающих окон на сцене и всплывать над рабочим столом.
Код
Вот пример кода, который создает уведомления при нажатии на кнопку. Всплывающее окно исчезает через 3 секунды. После этого вы можете снова нажать кнопку.
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Popup;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Notification extends Application {
static double width = 800;
static double height = 600;
static int counter = 0;
Stage stage;
@Override
public void start(Stage stage) {
this.stage = stage;
// content area
StackPane root = new StackPane();
root.setStyle("-fx-background-color:white");
// button which shows a popup
Button notificationButton = new Button("Add Popup");
notificationButton.setOnAction(e -> {
addNotification("This is notification nr. " + (++counter));
});
root.getChildren().add(notificationButton);
Scene scene = new Scene(root, width, height);
stage.setScene(scene);
stage.show();
}
private void addNotification(String message) {
// create popup content
Label messageLabel = new Label(message);
final StackPane content = new StackPane();
content.setPrefSize(200, 200);
content.setStyle("-fx-background-color:lightgrey");
content.setOpacity(0.5);
content.setMouseTransparent(true);
content.getChildren().addAll(messageLabel);
// create popup and show it
final Popup popup = new Popup();
popup.setX(stage.getX() + (stage.getScene().getWidth() - 200)/2);
popup.setY(stage.getY() + (stage.getScene().getHeight() - 200)/2);
popup.getContent().add(content);
popup.show(stage.getScene().getWindow());
// hide popup after 3 seconds
Duration displayDuration = Duration.millis(3000);
KeyFrame displayDurationKeyFrame = new KeyFrame(displayDuration);
Timeline timeline = new Timeline(displayDurationKeyFrame);
timeline.setOnFinished(e -> {
popup.hide();
});
timeline.play();
}
public static void main(String[] args) {
launch(args);
}
}
Спасибо, но это, кажется, не работает на Windows 7, Java 8u65. Тот же эффект, всплывающие блоки. Однако с новым этапом возникает другая проблема: когда пользователь e. г. когда вы показываете всплывающее окно, новый этап фокусируется. Он должен показывать только уведомление, но пользователь должен иметь возможность продолжать печатать. – Roland
Я отредактировал исходный код. Проверьте это! – Marian
Спасибо, сейчас основное внимание уделяется, но основная проблема остается. Я все еще не могу нажать кнопку, пока всплывающее окно не исчезнет. Это действительно работает для вас? Какую систему и версию Java вы используете? – Roland