Reputation: 45
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,
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
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();
}
Upvotes: 2