To detect mouse event on JavaFX LineChart Series Node - here is a simple example to change mouse cursor when mouse move over the lines.
seriesR.getNode().setOnMouseEntered(onMouseEnteredSeriesListener);
seriesR.getNode().setOnMouseExited(onMouseExitedSeriesListener);
...
//Lambda expression
EventHandler<MouseEvent> onMouseEnteredSeriesListener =
(MouseEvent event) -> {
((Node)(event.getSource())).setCursor(Cursor.HAND);
};
/* traditional expression
EventHandler<MouseEvent> onMouseEnteredSeriesListener =
new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
((Node)(event.getSource())).setCursor(Cursor.HAND);
}
};
*/
//Lambda expression
EventHandler<MouseEvent> onMouseExitedSeriesListener =
(MouseEvent event) -> {
((Node)(event.getSource())).setCursor(Cursor.DEFAULT);
};
/* traditional expression
EventHandler<MouseEvent> onMouseExitedSeriesListener =
new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
((Node)(event.getSource())).setCursor(Cursor.DEFAULT);
}
};
*/
Modify the example code of "Display brightness histogram on JavaFX LineChart" to change mouse cursor when move over lines in LineCharts.
package javafx_imagehistogram;
import java.awt.Color;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelReader;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
* @web http://java-buddy.blogspot.com
*/
public class JavaFX_ImageHistogram extends Application {
String defaultImage = "http://goo.gl/kYEQl";
@Override
public void start(Stage primaryStage) {
Label labelInfo = new Label();
labelInfo.setText(
"java.version: " + System.getProperty("java.version") + "\n"
+ "javafx.runtime.version: " + System.getProperty("javafx.runtime.version")
);
TextField textSrc = new TextField();
textSrc.setText(defaultImage);
Button btnDo = new Button("Do Histogram");
ImageView imageView = new ImageView();
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
final LineChart<String, Number> chartHistogram
= new LineChart<>(xAxis, yAxis);
chartHistogram.setCreateSymbols(false);
final CategoryAxis xAxis_brightness = new CategoryAxis();
final NumberAxis yAxis_brightness = new NumberAxis();
final LineChart<String, Number> brightnessHistogram
= new LineChart<>(xAxis_brightness, yAxis_brightness);
brightnessHistogram.setCreateSymbols(false);
VBox vBoxHistogram = new VBox();
vBoxHistogram.getChildren().addAll(chartHistogram, brightnessHistogram);
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(vBoxHistogram);
btnDo.setOnAction((ActionEvent event) -> {
String imageSrc = textSrc.getText();
Image image = new Image(imageSrc);
imageView.setImage(image);
chartHistogram.getData().clear();
brightnessHistogram.getData().clear();
ImageHistogram imageHistogram = new ImageHistogram(image);
if(imageHistogram.isSuccess()){
XYChart.Series seriesR = imageHistogram.getSeriesRed();
XYChart.Series seriesG = imageHistogram.getSeriesGreen();
XYChart.Series seriesB = imageHistogram.getSeriesBlue();
XYChart.Series seriesBr = imageHistogram.getSeriesBrightness();
chartHistogram.getData().addAll(
seriesR, seriesG, seriesB);
brightnessHistogram.getData().add(seriesBr);
seriesR.getNode().setOnMouseEntered(onMouseEnteredSeriesListener);
seriesR.getNode().setOnMouseExited(onMouseExitedSeriesListener);
seriesG.getNode().setOnMouseEntered(onMouseEnteredSeriesListener);
seriesG.getNode().setOnMouseExited(onMouseExitedSeriesListener);
seriesB.getNode().setOnMouseEntered(onMouseEnteredSeriesListener);
seriesB.getNode().setOnMouseExited(onMouseExitedSeriesListener);
seriesBr.getNode().setOnMouseEntered(onMouseEnteredSeriesListener);
seriesBr.getNode().setOnMouseExited(onMouseExitedSeriesListener);
}
});
HBox hBox = new HBox();
hBox.getChildren().addAll(imageView, scrollPane);
VBox vBox = new VBox();
vBox.getChildren().addAll(labelInfo, textSrc, btnDo, hBox);
StackPane root = new StackPane();
root.getChildren().add(vBox);
Scene scene = new Scene(root, 1000, 500);
primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
//Lambda expression
EventHandler<MouseEvent> onMouseEnteredSeriesListener =
(MouseEvent event) -> {
((Node)(event.getSource())).setCursor(Cursor.HAND);
};
/* traditional expression
EventHandler<MouseEvent> onMouseEnteredSeriesListener =
new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
((Node)(event.getSource())).setCursor(Cursor.HAND);
}
};
*/
//Lambda expression
EventHandler<MouseEvent> onMouseExitedSeriesListener =
(MouseEvent event) -> {
((Node)(event.getSource())).setCursor(Cursor.DEFAULT);
};
/* traditional expression
EventHandler<MouseEvent> onMouseExitedSeriesListener =
new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
((Node)(event.getSource())).setCursor(Cursor.DEFAULT);
}
};
*/
class ImageHistogram {
private Image image;
private long alpha[] = new long[256];
private long red[] = new long[256];
private long green[] = new long[256];
private long blue[] = new long[256];
private long brightness[] = new long[256];
XYChart.Series seriesAlpha;
XYChart.Series seriesRed;
XYChart.Series seriesGreen;
XYChart.Series seriesBlue;
XYChart.Series seriesBrightness;
private boolean success;
ImageHistogram(Image src) {
image = src;
success = false;
//init
for (int i = 0; i < 256; i++) {
alpha[i] = red[i] = green[i] = blue[i] = 0;
brightness[i] = 0;
}
PixelReader pixelReader = image.getPixelReader();
if (pixelReader == null) {
return;
}
//count pixels
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
int argb = pixelReader.getArgb(x, y);
int a = (0xff & (argb >> 24));
int r = (0xff & (argb >> 16));
int g = (0xff & (argb >> 8));
int b = (0xff & argb);
alpha[a]++;
red[r]++;
green[g]++;
blue[b]++;
//Convert RGB to HSB (or HSV)
float[] hsb = new float[3];
Color.RGBtoHSB(r, g, b, hsb);
brightness[(int)(hsb[2]*255)]++;
}
}
seriesAlpha = new XYChart.Series();
seriesRed = new XYChart.Series();
seriesGreen = new XYChart.Series();
seriesBlue = new XYChart.Series();
seriesBrightness = new XYChart.Series();
seriesAlpha.setName("alpha");
seriesRed.setName("red");
seriesGreen.setName("green");
seriesBlue.setName("blue");
seriesBrightness.setName("Brightness");
//copy alpha[], red[], green[], blue[], brightness
//to seriesAlpha, seriesRed, seriesGreen, seriesBlue, seriesBrightness
for (int i = 0; i < 256; i++) {
seriesAlpha.getData().add(new XYChart.Data(String.valueOf(i), alpha[i]));
seriesRed.getData().add(new XYChart.Data(String.valueOf(i), red[i]));
seriesGreen.getData().add(new XYChart.Data(String.valueOf(i), green[i]));
seriesBlue.getData().add(new XYChart.Data(String.valueOf(i), blue[i]));
seriesBrightness.getData().add(new XYChart.Data(String.valueOf(i), brightness[i]));
}
success = true;
}
public boolean isSuccess() {
return success;
}
public XYChart.Series getSeriesAlpha() {
return seriesAlpha;
}
public XYChart.Series getSeriesRed() {
return seriesRed;
}
public XYChart.Series getSeriesGreen() {
return seriesGreen;
}
public XYChart.Series getSeriesBlue() {
return seriesBlue;
}
public XYChart.Series getSeriesBrightness() {
return seriesBrightness;
}
}
}

No comments:
Post a Comment