当前节点+折线图+JavaFX
Present node +LineChart + JavaFX
我在 javafx8 中使用 LineChart
,我能够在图表中动态绘制序列,并为每个输入绘制符号。但问题是我只想显示当前节点的符号,而不是已添加的节点的符号。
我试过了:
linechart.setCreateSymbols(false);
但这不符合我的要求 needs.It 停止为输入创建符号。
谁能告诉我如何只显示当前符号而不显示添加的符号????
只需跟踪添加的最后一个数据点的节点。添加新点时,将之前"last point"的可见性设置为false。
您可以直接使用
import java.util.Random;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class LineChartShowSymbolForLastPointOnly extends Application {
private Node lastPointAdded ;
@Override
public void start(Stage primaryStage) {
LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis());
Series<Number, Number> series = new Series<>();
chart.getData().add(series);
chart.setAnimated(false);
Button addDataPointButton = new Button("Add data point");
Random rng = new Random();
addDataPointButton.setOnAction(e -> {
if (lastPointAdded != null) {
lastPointAdded.setVisible(false);
}
Data<Number, Number> data = new Data<>(series.getData().size(), rng.nextDouble());
series.getData().add(data);
lastPointAdded = data.getNode();
});
BorderPane.setAlignment(addDataPointButton, Pos.CENTER);
BorderPane.setMargin(addDataPointButton, new Insets(10));
BorderPane root = new BorderPane(chart, null, null, addDataPointButton, null);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果您希望能够更轻松地分解代码,您可以使用 ObjectProperty
并注册一个侦听器:
import java.util.Random;
import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class LineChartShowSymbolForLastPointOnly extends Application {
@Override
public void start(Stage primaryStage) {
LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis());
Series<Number, Number> series = new Series<>();
chart.getData().add(series);
chart.setAnimated(false);
ObjectProperty<Node> lastPointAdded = new SimpleObjectProperty<>();
lastPointAdded.addListener((obs, oldNode, newNode) -> {
if (oldNode != null) {
oldNode.setVisible(false);
}
});
Button addDataPointButton = new Button("Add data point");
Random rng = new Random();
addDataPointButton.setOnAction(e -> {
Data<Number, Number> data = new Data<>(series.getData().size(), rng.nextDouble());
series.getData().add(data);
lastPointAdded.set(data.getNode());
});
BorderPane.setAlignment(addDataPointButton, Pos.CENTER);
BorderPane.setMargin(addDataPointButton, new Insets(10));
BorderPane root = new BorderPane(chart, null, null, addDataPointButton, null);
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我在 javafx8 中使用 LineChart
,我能够在图表中动态绘制序列,并为每个输入绘制符号。但问题是我只想显示当前节点的符号,而不是已添加的节点的符号。
我试过了:
linechart.setCreateSymbols(false);
但这不符合我的要求 needs.It 停止为输入创建符号。
谁能告诉我如何只显示当前符号而不显示添加的符号????
只需跟踪添加的最后一个数据点的节点。添加新点时,将之前"last point"的可见性设置为false。
您可以直接使用
import java.util.Random;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class LineChartShowSymbolForLastPointOnly extends Application {
private Node lastPointAdded ;
@Override
public void start(Stage primaryStage) {
LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis());
Series<Number, Number> series = new Series<>();
chart.getData().add(series);
chart.setAnimated(false);
Button addDataPointButton = new Button("Add data point");
Random rng = new Random();
addDataPointButton.setOnAction(e -> {
if (lastPointAdded != null) {
lastPointAdded.setVisible(false);
}
Data<Number, Number> data = new Data<>(series.getData().size(), rng.nextDouble());
series.getData().add(data);
lastPointAdded = data.getNode();
});
BorderPane.setAlignment(addDataPointButton, Pos.CENTER);
BorderPane.setMargin(addDataPointButton, new Insets(10));
BorderPane root = new BorderPane(chart, null, null, addDataPointButton, null);
primaryStage.setScene(new Scene(root, 800, 600));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果您希望能够更轻松地分解代码,您可以使用 ObjectProperty
并注册一个侦听器:
import java.util.Random;
import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class LineChartShowSymbolForLastPointOnly extends Application {
@Override
public void start(Stage primaryStage) {
LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis());
Series<Number, Number> series = new Series<>();
chart.getData().add(series);
chart.setAnimated(false);
ObjectProperty<Node> lastPointAdded = new SimpleObjectProperty<>();
lastPointAdded.addListener((obs, oldNode, newNode) -> {
if (oldNode != null) {
oldNode.setVisible(false);
}
});
Button addDataPointButton = new Button("Add data point");
Random rng = new Random();
addDataPointButton.setOnAction(e -> {
Data<Number, Number> data = new Data<>(series.getData().size(), rng.nextDouble());
series.getData().add(data);
lastPointAdded.set(data.getNode());
});
BorderPane.setAlignment(addDataPointButton, Pos.CENTER);
BorderPane.setMargin(addDataPointButton, new Insets(10));
BorderPane root = new BorderPane(chart, null, null, addDataPointButton, null);
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}