2016-02-09 64 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。 G。類型,而你顯示一個彈出窗口,新的階段獲得焦點。它應該只顯示通知,但用戶應該可以繼續輸入。 – Roland

+0

我編輯了原始代碼。一探究竟! – Marian

+0

謝謝,現在的重點工作,但主要問題仍然存在。我仍然無法點擊按鈕,直到彈出消失。這對你真的有用嗎?你使用的是什麼系統和Java版本? – Roland

相關問題