我有一个JavaFx自定义条形图,其标签显示在FXCanvas上,用于SWT RCP应用程序。感谢发布How to clear text added in a javafx barchart?
的答案但是,当我将鼠标事件监听器添加到条形图的节点时,未检测到鼠标事件
private void addMouseListener(XYChart.Series<String, Number> series) {
for (XYChart.Data<String, Number> xyData : series.getData()) {
if (xyData != null && xyData.getNode() != null) {
final Node node = xyData.getNode();
node.setOnMousePressed((MouseEvent event) -> {
System.out.println("you clicked " + xyData.toString());
}
}
}
使用下面的代码行
在createBarChart中调用addMouseListener BarChartExt barChart = new BarChartExt<String, Number>(xAxis, yAxis);
barChart.setTitle("Summary");
Scene scene = new Scene(barChart, 300, 300);
barChart.getData().add(series);
addMouseListener(series)
scene.getStylesheets().add("css/barchart.css");
canvas.setScene(scene);
如果我将Custom BarChart更改为javafx.chart.BarChart类,则会识别事件。仅适用于自定义BarChart鼠标事件未触发。
感谢是否有人可以帮助我使用这个用例。 TIA
答案 0 :(得分:1)
自定义条形图使用TextFlow创建系列数据。以下是摘录
@Override
protected void seriesAdded(Series<X, Y> series, int seriesIndex) {
super.seriesAdded(series, seriesIndex);
for (int j = 0; j < series.getData().size(); j++) {
Data<X, Y> item = series.getData().get(j);
Text text = new Text(String.valueOf(item.getYValue()););
text.setStyle("-fx-font-size: 10pt;");
TextFlow textFlow = new TextFlow(text);
textFlow.setTextAlignment(TextAlignment.CENTER);
nodeMap.put(item.getNode(), textFlow);
getPlotChildren().add(textFlow);
textFlow.setOnMousePressed((MouseEvent event) -> {
System.out.println("custom bar chart you clicked " + item);
});
}
}
由于系列数据节点被TextFlow覆盖。我不得不将侦听器添加到TextFlow而不是Node。下面是自定义条形图的屏幕截图。