Javafx 2 JavaFX折线图悬停值
我正在用JavaFX创建一个折线图。目前一切都很好,它成功地用数据库存储过程中需要的数据创建了图表。无论如何,如果可能的话,我需要的是在折线图上的每个数据点上都有一个鼠标悬停事件,说明特定点后面的值,例如150000英镑。我在PieCharts上看到过这样的例子,它显示了悬停时的%值,但我在任何地方都找不到线条图的例子,甚至可以这样做吗 如果可能的话,有人能给我指出正确的方向吗 迄今为止的代码:Javafx 2 JavaFX折线图悬停值,javafx-2,Javafx 2,我正在用JavaFX创建一个折线图。目前一切都很好,它成功地用数据库存储过程中需要的数据创建了图表。无论如何,如果可能的话,我需要的是在折线图上的每个数据点上都有一个鼠标悬停事件,说明特定点后面的值,例如150000英镑。我在PieCharts上看到过这样的例子,它显示了悬停时的%值,但我在任何地方都找不到线条图的例子,甚至可以这样做吗 如果可能的话,有人能给我指出正确的方向吗 迄今为止的代码: private static final String MINIMIZED = "MINIMIZED
private static final String MINIMIZED = "MINIMIZED";
private static final String MAXIMIZED = "MAXIMIZED";
private static String chartState = MINIMIZED;
// 12 Month Sales Chart
XYChart.Series<String, Number> series = new XYChart.Series<>();
XYChart.Series<String, Number> series2 = new XYChart.Series<>();
public void getDeltaData() {
try {
Connection con = DriverManager.getConnection(connectionUrl);
//Get all records from table
String SQL = "";
Statement stmt = con.createStatement();
//Create the result set from query execution.
ResultSet rs = stmt.executeQuery(SQL);
while (rs.next()) {
series.getData().add(new XYChart.Data<String, Number>(rs.getString(1),
Double.parseDouble(rs.getString(7))));
series2.getData().add(new XYChart.Data<String, Number>(rs.getString(1),
Double.parseDouble(rs.getString(8))));
}
rs.close();
stmt.close();
} catch (Exception e) {
}
yearChart = createChart();
}
protected LineChart<String, Number> createChart() {
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
// setup chart
series.setName("Target");
series2.setName("Actual");
xAxis.setLabel("Period");
yAxis.setLabel("£");
yearChart.getData().add(series);
yearChart.getData().add(series2);
yearChart.setCreateSymbols(false);
return yearChart;
}
private static final String MINIMIZED=“MINIMIZED”;
私有静态最终字符串MAXIMIZED=“MAXIMIZED”;
私有静态字符串chartState=最小化;
//12个月销售图
XYChart.Series系列=新的XYChart.Series();
XYChart.Series系列2=新的XYChart.Series();
公共无效getDeltaData(){
试一试{
Connection con=DriverManager.getConnection(connectionUrl);
//从表中获取所有记录
字符串SQL=“”;
语句stmt=con.createStatement();
//从查询执行创建结果集。
结果集rs=stmt.executeQuery(SQL);
while(rs.next()){
series.getData().add(新的XYChart.Data)(rs.getString(1),
Double.parseDouble(rs.getString(7));
series2.getData().add(新的XYChart.Data)(rs.getString(1),
Double.parseDouble(rs.getString(8));
}
rs.close();
stmt.close();
}捕获(例外e){
}
yearChart=createChart();
}
受保护的折线图createChart(){
最终CategoryAxis xAxis=新CategoryAxis();
最终数字axis yAxis=新数字axis();
//设置图
series.setName(“Target”);
序列2.集合名(“实际”);
xAxis.setLabel(“期间”);
yAxis.setLabel(“£”);
yearChart.getData().add(系列);
yearChart.getData().add(series2);
年表。SetCreateSynumbles(假);
回归年表;
}
jewelsea提供的答案是这个问题的完美解决方案。
谢谢您,jewelsea。用于显示每个数据点的自定义节点。将鼠标悬停节点设置为容器,如。添加鼠标事件监听器,以便知道鼠标和节点何时启动。输入时,在鼠标悬停窗格中为该值放置一个空格。退出时,从悬停窗格中删除标签
有一些例子可以演示这种技术
示例代码的输出显示为光标悬停在22节点上
使用工具提示:
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.control.Tooltip;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXApplication250 extends Application
{
@Override
public void start(Stage stage)
{
stage.setTitle("Line Chart Sample");
//defining the axes
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("Number of Month");
//creating the chart
final LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setTitle("Stock Monitoring, 2010");
//defining a series
XYChart.Series<Number, Number> series = new XYChart.Series();
series.setName("My portfolio");
//populating the series with data
Random rand = new Random();
TreeMap<Integer, Integer> data = new TreeMap();
//Create Chart data
for (int i = 0; i < 3; i++) {
data.put(rand.nextInt(51), rand.nextInt(51));
}
Set set = data.entrySet();
Iterator i = set.iterator();
while (i.hasNext()) {
Map.Entry me = (Map.Entry) i.next();
System.out.println(me.getKey() + " - " + me.getValue());
series.getData().add(new XYChart.Data(me.getKey(), me.getValue()));//Add data to series
}
lineChart.getData().add(series);
//loop through data and add tooltip
//THIS MUST BE DONE AFTER ADDING THE DATA TO THE CHART!
for (Data<Number, Number> entry : series.getData()) {
System.out.println("Entered!");
Tooltip t = new Tooltip(entry.getYValue().toString());
Tooltip.install(entry.getNode(), t);
}
Scene scene = new Scene(lineChart, 800, 600);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}
import java.util.Iterator;
导入java.util.Map;
导入java.util.Random;
导入java.util.Set;
导入java.util.TreeMap;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.chart.LineChart;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.XYChart;
导入javafx.scene.chart.XYChart.Data;
导入javafx.scene.control.Tooltip;
导入javafx.stage.stage;
/**
*
*@author blj0011
*/
公共类JavaFXApplication250扩展了应用程序
{
@凌驾
公众假期开始(阶段)
{
阶段。设置标题(“折线图样本”);
//定义轴
最终数字axis xAxis=新数字axis();
最终数字axis yAxis=新数字axis();
xAxis.setLabel(“月数”);
//创建图表
最终线形图线形图=新线形图(xAxis,yAxis);
线形图.setTitle(“库存监控,2010年”);
//定义系列
XYChart.Series系列=新的XYChart.Series();
series.setName(“我的投资组合”);
//用数据填充序列
Random rand=新的Random();
树映射数据=新树映射();
//创建图表数据
对于(int i=0;i<3;i++){
数据出售(兰特耐克斯汀(51)、兰特耐克斯汀(51));
}
Set=data.entrySet();
迭代器i=set.Iterator();
while(i.hasNext()){
Map.Entry me=(Map.Entry)i.next();
System.out.println(me.getKey()+“-”+me.getValue());
series.getData().add(新的XYChart.Data(me.getKey(),me.getValue());//向series添加数据
}
lineChart.getData().add(系列);
//循环浏览数据并添加工具提示
//这必须在将数据添加到图表后完成!
对于(数据输入:series.getData()){
System.out.println(“已输入!”);
工具提示t=新工具提示(entry.getYValue().toString());
安装(entry.getNode(),t);
}
场景=新场景(线条图,800600);
舞台场景;
stage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args)
{
发射(args);
}
}
非常感谢您的支持,我永远也无法实现这一点。最后还有一个小问题。如何将悬停设置为始终位于前方?我的一些值是6位数,它们隐藏在下一个节点后面,这很烦人-请参阅以确保悬停的节点始终是顶部节点,只需在鼠标进入节点时调用即可。我更新了示例代码以包含这个。非常感谢。我就快到了,但我想label.toFront()会把它剪掉,而不仅仅是toFront()。再次感谢您的帮助,非常感谢:)toFront()表示hoverNode将在其父节点的前面执行inf,对吗?不是在整个哈特面前。如果你试图添加更复杂的东西(一个更大的容器),那么你可能会越界。如何避免悬停在图表的一角而标签仅部分可见的情况?似乎标签只在图表区域内绘制,如果部分标签在图表区域外,我需要将其替换,或者将其发送到所有标签的前面,甚至在图表区域外。有什么解决办法吗@J