我尝试为我的PieChart点击创建标签,但不幸的是我的标签永远不可见。
我在StackOverFlow上发现了类似的主题:Label not showing on mouse event JavaFx 但我的申请并不那么简单。由于我的架构,我无法将我的Label添加到孩子列表中。
(您可以在此处找到图表:http://i.stack.imgur.com/ZFJaR.png)
这是我的代码:
PieChartNode.java
package nodeStatsVision.chartFactory;
import java.util.ArrayList;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import nodeStatsVision.beans.ListRepere;
import nodeStatsVision.beans.OptionsChart;
import nodeStatsVision.beans.ValueStat;
/**
*
* @author Zombkey.
*/
public class PieChartNode implements ChartNode {
private ListRepere categories;
private ArrayList<ValueStat> values;
private ObservableList<PieChart.Data> pieChartData;
private Node node;
public PieChartNode(ListRepere categories, ArrayList<ValueStat> values){
this.categories = categories;
this.values = values;
pieChartData = FXCollections.observableArrayList();
node = new PieChart(pieChartData);
Platform.runLater(new Runnable() {
@Override
public void run() {
formatData();
}
});
}
private void formatData() {
final Label caption = new Label("");
caption.setTextFill(Color.DARKORANGE);
caption.setStyle("-fx-font: 24 arial;");
for(ValueStat v : values){
PieChart.Data dataTemp = new PieChart.Data(v.getCategorie().getStringName(),v.getDoubleValue());
pieChartData.add(dataTemp);
dataTemp.getNode().addEventHandler(MouseEvent.MOUSE_CLICKED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
System.out.println("event : "+v.getCategorie().getStringName()+" : "+v.getDoubleValue());
caption.setTranslateX(e.getSceneX());
caption.setTranslateY(e.getSceneY());
caption.setText(String.valueOf(dataTemp.getPieValue()));
caption.setVisible(true);
System.out.println("label "+caption);
}
});
}
}
@Override
public Node getNodeGraph() {
return node;
}
@Override
public void setOptions(OptionsChart optionsChart) {
//To implemente
}
}
您是否知道如何将我的标签添加到场景中?
谢谢!
(其他问题,为什么PieChart.Data的节点在ReadOnly上?)
Zombkey。
PS:对不起我的英语,我是一名法国学生,我还在学习:) Ps 2:第一次在StackOverflow上,如果我错了,请告诉我!
答案 0 :(得分:1)
您可以创建Label
名为caption
的样式,但不要将其添加到SceneGraph中。
某处必须将其添加到Parent
元素,否则将无法显示。
您的PieChart
被添加到父元素,否则将不会显示。所有其他JavaFX Node
也是如此。
关于你的第二个问题,请阅读JavaDocs:
只读访问表示饼图切片的节点。您可以使用它来添加鼠标事件侦听器等。
答案 1 :(得分:1)
好的!我为我的案子找到了一个解决方案!
从语义上讲,我的Label
仅适用于我的PieChart
。这就是为什么我不想把它带到我的SceneGraph。
我的ChartFactory返回Node
,然后显示它。因此,我的节点必须包含PieChart
和Label
。
我使用Group
创建StackPane
。在StackPane
我添加了PieChart
和Label
。然后我的工厂将Group
作为Node
返回。
删除代码!
package nodeStatsVision.chartFactory;
import java.util.ArrayList;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import nodeStatsVision.beans.ListRepere;
import nodeStatsVision.beans.OptionsChart;
import nodeStatsVision.beans.ValueStat;
/**
*
* @author Zombkey.
*/
public class PieChartNode implements ChartNode {
private ListRepere categories;
private ArrayList<ValueStat> values;
private ObservableList<PieChart.Data> pieChartData;
private Group group;
private Node node;
private final Label caption;
public PieChartNode(ListRepere categories, ArrayList<ValueStat> values){
this.categories = categories;
this.values = values;
group = new Group();
StackPane pane = new StackPane();
group.getChildren().add(pane);
pieChartData = FXCollections.observableArrayList();
node = new PieChart(pieChartData);
pane.getChildren().add(node);
caption = new Label("");
caption.setVisible(false);
caption.getStyleClass().addAll("chart-line-symbol", "chart-series-line");
caption.setStyle("-fx-font-size: 12; -fx-font-weight: bold;");
caption.setMinSize(Label.USE_PREF_SIZE, Label.USE_PREF_SIZE);
pane.getChildren().add(caption);
Platform.runLater(new Runnable() {
@Override
public void run() {
formatData();
}
});
}
private void formatData() {
for(ValueStat v : values){
PieChart.Data dataTemp = new PieChart.Data(v.getCategorie().getStringName(),v.getDoubleValue());
pieChartData.add(dataTemp);
dataTemp.getNode().addEventHandler(MouseEvent.MOUSE_ENTERED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
caption.setTranslateX(e.getX());
caption.setTranslateY(e.getY());
caption.setText(String.valueOf(dataTemp.getPieValue()));
caption.setVisible(true);
}
});
dataTemp.getNode().addEventHandler(MouseEvent.MOUSE_EXITED,
new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent e) {
caption.setVisible(false);
}
});
}
}
@Override
public Node getNodeGraph() {
return (Node)group;
}
@Override
public void setOptions(OptionsChart optionsChart) {
//To implemente
}
}
感谢@eckig的回答!
答案 2 :(得分:0)
您可以使用<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/tld/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>myCustomLib</taglib-uri>
<taglib-location>/tld/custom.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
<taglib-location>/tld/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fn</taglib-uri>
<taglib-location>/tld/fn.tld</taglib-location>
</taglib>
...
</jsp-config>
来显示值:
Tooltip