【问题标题】:How to hide and unhide the data points in a linechart in JavaFX?如何在 JavaFX 中隐藏和取消隐藏折线图中的数据点?
【发布时间】:2020-01-22 05:11:32
【问题描述】:

在我需要创建的应用程序中,我有一系列由线连接的点。我只需要查看图表的线条部分并隐藏点。但是,我需要通过单击图表中的适当位置来标记某些点。在我编写的代码中,我要么能够隐藏这些点而无法标记,要么能够标记但不能隐藏其余的点。我该怎么做才能隐藏点并标记所需的点?

package application;
import java.awt.Dimension;
import java.awt.Toolkit;
//import java.beans.EventHandler;

import java.util.ArrayList;
import javafx.event.EventHandler;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.Scene;
import javafx.scene.chart.Axis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class Main extends Application {
    public XYChart.Data<Integer, Integer> k = new XYChart.Data();
    public XYChart.Series series;
    String pth;
    public ObservableList<XYChart.Data<Integer, Integer>> dat = FXCollections.<XYChart.Data<Integer, Integer>>observableArrayList();
    public int c = 0;
    ArrayList<Integer> myListx = new ArrayList<Integer>();

    public void start(Stage stage) {
        stage.setTitle("Line Chart Sample");
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("Samples");
        yAxis.setLabel("Data");

        final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
        lineChart.setCreateSymbols(false);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int width = (int) screenSize.getWidth();
        int height = (int) screenSize.getHeight();

        StackPane spLineChart = new StackPane();
        spLineChart.getChildren().add(lineChart);

        while (c < 20) {
            k = new XYChart.Data<Integer, Integer>(c++, c * 6);
            dat.add(k);
            k.setNode(new Node(c));

        }
        series = new XYChart.Series("IMU Data", dat);

        lineChart.getData().addAll(series);

        xAxis.setVisible(true);
        yAxis.setVisible(true);
        spLineChart.setVisible(true);
        StackPane spButton = new StackPane();
        StackPane sp = new StackPane();
        VBox vbox = new VBox();
        VBox.setVgrow(spLineChart, Priority.ALWAYS);
        vbox.getChildren().addAll(sp, spLineChart, spButton);

        Scene scene = new Scene(vbox, width, height - 500);
        stage.setScene(scene);
        stage.show();

    }

    class Node extends StackPane {
        Node(int priorValue) {
            final Circle circle = createData();
            setOnMouseClicked(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent mouseEvent) {
                    if (mouseEvent.getButton().equals(MouseButton.PRIMARY)) {
                        getChildren().setAll(circle);
                        myListx.add(priorValue);
                    } else if (mouseEvent.getButton().equals(MouseButton.SECONDARY)) {
                        getChildren().clear();

                        myListx.remove(new Integer(priorValue));

                    }
                }

                ;
            });
        }

        private Circle createData() {
            Circle circle = new Circle();
            circle.setFill(Color.BLACK);
            circle.setStroke(Color.BLACK);
            circle.setRadius(4);
            return circle;
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

【问题讨论】:

  • 请努力清理损坏的代码格式...(注意里面不应该有任何制表符,而是使用 4 个空格)

标签: java javafx nodes linechart


【解决方案1】:

使用这个修改后的Node 类。在鼠标点击事件中,它会根据其子项的存在来切换效果。

class Node extends StackPane {
    Node(int priorValue) {
        setOnMouseClicked(event -> {
            if (getChildren().isEmpty()) {
                final Circle circle = createData();
                getChildren().setAll(circle);
            } else {
                getChildren().clear();
            }
            myListx.add(priorValue);
        });
    }

    private Circle createData() {
        Circle circle = new Circle();
        circle.setFill(Color.BLACK);
        circle.setStroke(Color.BLACK);
        circle.setRadius(4);
        return circle;
    }
}

注意:您可以考虑将您的课程重命名为 Node,因为它与 Node 冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多