2016-02-09 2 views
0

ЗадачаКак создать всплывающее уведомление, которое является прозрачным для мыши?

Я хотел бы создать окно уведомления, которое мышь прозрачна на сцену и на рабочем столе.

Проблема

Всплывающее не имеет функции 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); 
    } 

} 

ответ

0

Попробуйте это вместо этого. Я удалил initModality(), потому что это то, что заблокировало входные события от доставки в другое окно. Я также добавил слушателя, чтобы предотвратить новый фокус.

final Stage popup = new Stage(); 
popup.setX(stage.getX() + (stage.getScene().getWidth() - 200)/2); 
popup.setY(stage.getY() + (stage.getScene().getHeight() - 200)/2); 
popup.setScene(new Scene(content)); 
popup.initOwner(stage); 
popup.focusedProperty().addListener(new ChangeListener<Boolean>() { 
    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
     stage.requestFocus(); 
    } 
}); 
popup.initStyle(StageStyle.TRANSPARENT); 
popup.setOpacity(0.5); 
popup.show(); 

+0

Спасибо, но это, кажется, не работает на Windows 7, Java 8u65. Тот же эффект, всплывающие блоки. Однако с новым этапом возникает другая проблема: когда пользователь e. г. когда вы показываете всплывающее окно, новый этап фокусируется. Он должен показывать только уведомление, но пользователь должен иметь возможность продолжать печатать. – Roland

+0

Я отредактировал исходный код. Проверьте это! – Marian

+0

Спасибо, сейчас основное внимание уделяется, но основная проблема остается. Я все еще не могу нажать кнопку, пока всплывающее окно не исчезнет. Это действительно работает для вас? Какую систему и версию Java вы используете? – Roland

Смежные вопросы