2014-05-13 91 views
3

我想創建一個簡單的JavaFx類,向用戶顯示覆蓋用戶屏幕的半透明矩形(比如任意50%的透明度)。它應該簡單地讓我得到點擊鼠標點擊事件。這聽起來微不足道,但是當我創建透明窗口時,它們似乎對鼠標事件透明,而不僅僅是我對半透明可見性的要求。鼠標事件從未觸發。JavaFx透明窗口 - 是的請。鼠標透明 - 不,謝謝

我在矩形和根窗格上使用了setMouseTransparent(false),但這沒什麼區別。如果有人能指出任何錯誤/誤解,我會很感激。

下面是微不足道的測試類,我創建:

public class ClickScreen implements MouseListener { 

    private ClickScreenListener listener; 
    private Stage window; 
    private Point point; 

    public ClickScreen(ClickScreenListener listener) { 

     // Get screen size 
     Rectangle2D r = Screen.getPrimary().getBounds(); 

     // Something to put stuff in 
     StackPane root = new StackPane(); 

     // Translucent rectangle on the pane 
     Rectangle rectangle = new Rectangle(r.getWidth(), r.getHeight()); 
     rectangle.setFill(Color.rgb(183, 183, 183, 0.5)); 
     root.getChildren().add(rectangle); 

     Scene scene = new Scene(root, r.getWidth(), r.getHeight()); 
     scene.setFill(null); 

     window = new Stage(); 
     window.initStyle(StageStyle.TRANSPARENT); 
     window.setTitle("Click drop location"); 
     window.setScene(scene); 

     this.listener = listener; 

    } 

    public Point getLocation(){ 
     return point; 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     point = e.getLocationOnScreen(); 
     listener.screenClicked(point); 
    } 
} 

編輯: 透明度問題我遇到的一個簡單的例子是從這個世界,你好!例。當我將鼠標放在按鈕上時,點擊按鈕的機率爲50:50,或者單擊「通過」並將焦點放在底層窗口(通常是我的例子中的日食)。會愛你對此的想法。

public class HelloWorld extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Hello World!"); 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     Scene scene = new Scene(root, 300, 250); 
     scene.setFill(null); 

     primaryStage.setScene(scene); 
     primaryStage.initStyle(StageStyle.TRANSPARENT); 
     primaryStage.show(); 
    } 
} 
+1

你沒有連接你的listene到任何東西,像scene.setOnMouseClicked(聽衆)。查看[Handling JavaFX Events](http://docs.oracle.com/javafx/2/events/jfxpub-events.htm)以獲取更多詳細信息 – MadProgrammer

回答

2

檢查進口

您正在使用某種怪異的設置,在那裏你是混合AWT/Swing類和JavaFX類,這確實是不建議(並沒有在所有的工作以你使用的組合和方式)。在你的JavaFX程序中小心不要導入任何java.awt.*javax.swing.*類,除非你真的知道你在爲兩個不同的工具包混合代碼時做了什麼。

樣品溶液

這裏是一個只導入JavaFX類和利用JavaFX的事件,但在其他方面試圖堅守在你的問題的示例代碼的編碼/回調風格供試品溶液。 (通過使用Java 8 lambda可以進一步簡化示例)。

enter image description here

import javafx.application.Application; 
import javafx.event.*; 
import javafx.geometry.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.*; 

public class ClickListenerSample 
       extends Application 
       implements ClickScreenListener { 

    private Label clickFeedbackLabel = new Label(""); 

    @Override public void start(Stage stage) { 
     Button listen = new Button("listen"); 
     listen.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       new ClickScreen(ClickListenerSample.this); 
      } 
     }); 
     VBox layout = new VBox(10); 
     layout.getChildren().setAll(
      listen, 
      clickFeedbackLabel 
     ); 
     layout.setPadding(new Insets(10)); 

     stage.setScene(new Scene(layout, 100, 80)); 
     stage.show(); 
    } 

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

    @Override public void screenClicked(Point2D point) { 
     clickFeedbackLabel.setText(point.getX() + ", " + point.getY()); 
    } 
} 

interface ClickScreenListener { 
    void screenClicked(Point2D point); 
} 

class ClickScreen { 
    private ClickScreenListener listener; 
    private Stage window; 
    private Point2D point; 

    public ClickScreen(ClickScreenListener listener) { 
     // Get screen size 
     Rectangle2D r = Screen.getPrimary().getBounds(); 

     // Something to put stuff in 
     StackPane root = new StackPane(); 
     root.setStyle("-fx-background-color: null;"); 

     // Translucent rectangle on the pane 
     Rectangle rectangle = new Rectangle(r.getWidth(), r.getHeight()); 
     rectangle.setFill(Color.rgb(183, 183, 183, 0.5)); 
     root.getChildren().add(rectangle); 

     Scene scene = new Scene(root, r.getWidth(), r.getHeight()); 
     scene.setFill(null); 

     window = new Stage(); 
     window.initStyle(StageStyle.TRANSPARENT); 
     window.setTitle("Click drop location"); 
     window.setScene(scene); 

     scene.setOnMouseClicked(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       point = new Point2D(event.getScreenX(), event.getScreenY()); 
       listener.screenClicked(point); 
       window.hide(); 
      } 
     }); 

     window.show(); 

     this.listener = listener; 
    } 

    public Point2D getLocation(){ 
     return point; 
    } 
} 
+0

感謝您的代碼,通過混合顯示我的顏色爲JavaFx noob在AWT。儘管如此,仍然沒有工作。我認爲我有一個與透明度相關的問題,我將在原始文章中添加一個編輯,以包含一個更簡單的透明度問題。 – ph73nt

+0

好的。作爲參考,我發佈的示例在Java 8u5,Win 7,ATI卡硬件加速管道上爲我工作。 – jewelsea

+0

看起來我必須在系統上等待大約10秒才能使點擊在透明項目上按預期工作。您的示例很好地工作,謝謝。 – ph73nt