sapayth
sapayth

Reputation: 45

JavaFX detect mouse movement outside the scene

I am trying to build a color picker where user can see the RGB value where the mouse pointer is.

The problem is, when the mouse pointer goes outside the scene, it is not working. But I use another KeyTyped event and that is working fine. Meaning, when mouse is outside the scene and you press any button, you can see the RGB value of the mouse pointing.

Now,

  1. Is there any way to use the KeyTyped event when mouse move?
  2. Is there any other way to detect mouse pointing location outside the scene?

Here is the code:

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);
    }

}

Thanks in advance.

Upvotes: 3

Views: 1936

Answers (1)

MaQuiNa1995
MaQuiNa1995

Reputation: 431

Okey you need to:

implements NativeMouseInputListener in your class

then you need to register the hook:

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);
}

then you will need to choose the mouse event and put into the getMousePointColor() method:

    @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("------------------------------------------------------");
}

For example:

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

JNative Hook Latest Version

JNative Hook Documention

Upvotes: 2

Related Questions