Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx 2 JavaFX折线图悬停值_Javafx 2 - Fatal编程技术网

Javafx 2 JavaFX折线图悬停值

Javafx 2 JavaFX折线图悬停值,javafx-2,Javafx 2,我正在用JavaFX创建一个折线图。目前一切都很好,它成功地用数据库存储过程中需要的数据创建了图表。无论如何,如果可能的话,我需要的是在折线图上的每个数据点上都有一个鼠标悬停事件,说明特定点后面的值,例如150000英镑。我在PieCharts上看到过这样的例子,它显示了悬停时的%值,但我在任何地方都找不到线条图的例子,甚至可以这样做吗 如果可能的话,有人能给我指出正确的方向吗 迄今为止的代码: private static final String MINIMIZED = "MINIMIZED

我正在用JavaFX创建一个折线图。目前一切都很好,它成功地用数据库存储过程中需要的数据创建了图表。无论如何,如果可能的话,我需要的是在折线图上的每个数据点上都有一个鼠标悬停事件,说明特定点后面的值,例如150000英镑。我在PieCharts上看到过这样的例子,它显示了悬停时的%值,但我在任何地方都找不到线条图的例子,甚至可以这样做吗

如果可能的话,有人能给我指出正确的方向吗

迄今为止的代码:

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