2017-06-14 20 views
1

マウスピッカーのある場所にあるRGBの値を見ることができるカラーピッカーを作成しようとしています。JavaFXがシーンの外でマウスの動きを検出しました

問題は、マウスポインタがシーンの外に出たときに機能しないことです。しかし、私は別のKeyTypedイベントを使用して、それは正常に動作しています。つまり、マウスがシーンの外側にあり、いずれかのボタンを押すと、RGBのマウスポインティング値が表示されます。

さて、

  1. は、マウスが移動したときにkeyTypedにイベントを使用する方法はありますか?
  2. シーンの外でマウスのポインティング位置を検出する他の方法はありますか?ここで

コードは次のとおりです。事前に

import java.awt.Color; 
import java.awt.MouseInfo; 
import java.awt.Point; 
import java.awt.Robot; 
import javafx.application.Application; 
import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

/* 
* @author sapaythhossain 
*/ 
public class ColorPicker extends Application { 

    private Stage window; 
    private Scene scene; 
    private double width; 
    private double height; 
    private String title; 
    private Label colorLabel; 
    private Label rgbLabel; 
    private Label htmlLabel; 
    private Label rgbValueLabel; 
    private Label htmlValueLabel; 
    private Label bValueLabel; 

    private int RGBr; 
    private int RGBg; 
    private int RGBb; 

    private Color currentColor; 
    private Robot robot; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     title = "Color Picker"; 
     width = 220; 
     height = 80; 

     robot = new Robot(); 

     window = primaryStage; 
     window.setTitle(title); 

     colorLabel = new Label(); 
     colorLabel.setWrapText(true); 
     colorLabel.setMinSize(50, 50); 
     colorLabel.setStyle(
       "-fx-background-color: rgba(" + RGBr + "," + RGBg + "," + RGBb + ",1);" 
      ); 

     VBox leftRow = new VBox(10); 
     leftRow.getChildren().addAll(colorLabel); 

     rgbLabel = new Label("RGB: "); 
     htmlLabel = new Label("HTML: "); 

     rgbValueLabel = new Label(""); 
     htmlValueLabel = new Label(""); 
     bValueLabel = new Label(); 

     VBox middleRow = new VBox(); 
     middleRow.getChildren().addAll(rgbLabel, htmlLabel); 

     VBox rightRow = new VBox(); 
     rightRow.getChildren().addAll(rgbValueLabel, htmlValueLabel, bValueLabel); 

     HBox layout = new HBox(10); 
     layout.getChildren().addAll(leftRow, middleRow, rightRow); 

     EventHandler handler = (EventHandler) (Event event) -> { 
      changeColor(); 
     }; 

     scene = new Scene(layout, width, height); 
     scene.setOnMouseMoved(handler); 
     scene.setOnKeyTyped(handler); 



     window.setScene(scene); 
     window.show(); 
    } 

    public void changeColor() { 
     Point p = MouseInfo.getPointerInfo().getLocation(); 
     currentColor = robot.getPixelColor(p.x, p.y); 

     RGBr = currentColor.getRed(); 
     RGBg = currentColor.getGreen(); 
     RGBb = currentColor.getBlue(); 

     String colorString = String.valueOf(RGBr) + ", " 
       + String.valueOf(RGBg) + ", " + String.valueOf(RGBb); 

     colorLabel.setStyle(
       "-fx-background-color: rgba(" + RGBr + "," + RGBg + "," + RGBb + ",1);" 
      ); 
     String hex = String.format("#%02x%02x%02x", RGBr, RGBg, RGBb); 
     htmlValueLabel.setText(hex); 
     rgbValueLabel.setText(colorString); 
    } 

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

} 

感謝。

+0

あなたはそれも、それはJavaアプリケーションの外に多くのご提案を – MaQuiNa1995

+0

おかげですべてのイベントをキャッチし、この目的のために 'Jnativehook'ライブラリを使用することができます。私はJavaで新しいです。 Jnativehookライブラリを使用するために私が従うべきステップを教えてください。 – sapayth

+0

https://stackoverflow.com/questions/16635514/how-to-get-location-of-mouse-in-javafx – Sedrick

答えて

1

オーケー、あなたがする必要がある:あなたのクラスで

implements NativeMouseInputListener

は、あなたはフックを登録する必要があります。

private void createHook() { 
    try { 
     // here you starts the hook 
     GlobalScreen.registerNativeHook(); 
    } catch (NativeHookException ex) { 
     //TODO Exception handling 
    } 

    // here you add the listener for the hook 
    GlobalScreen.addNativeMouseListener(this); 
} 

、あなたはマウスイベントを選択し、getMousePointColorに配置する必要があります()メソッド:

@Override 
    public void nativeMouseClicked(NativeMouseEvent nme) { 
    } 

    @Override 
    public void nativeMousePressed(NativeMouseEvent nme) { 
    } 

    @Override 
    public void nativeMouseReleased(NativeMouseEvent nme) { 
    } 

    @Override 
    public void nativeMouseMoved(NativeMouseEvent nme) { 
    } 

    @Override 
    public void nativeMouseDragged(NativeMouseEvent nme) { 
    } 

private void getMousePointColor() { 
    int xLocation = MouseInfo.getPointerInfo().getLocation().x; 
    int yLocation = MouseInfo.getPointerInfo().getLocation().y; 
    System.out.println("------------------------------------------------------"); 

    Robot r; 
    try { 
     r = new Robot(); 
     System.out.println(r.getPixelColor(xLocation, yLocation)); 
    } catch (AWTException ex) { 
     //TODO Exception handling 
    } 
    System.out.println("------------------------------------------------------"); 
} 

例:

@Override 
    public void nativeMouseClicked(NativeMouseEvent nme) { 
     getMousePointColor(); 
    } 

JNative Hook Latest Version

JNative Hook Documention

関連する問題