Я пишу демонстрацию JavaFX, чтобы добавить гистограмму в Subscene и изменить значение ряда гистограмм в KeyFrame на временной шкале.
В Oracle JDK8 корректное обновление графической диаграммы гистограммы, но в Oracle JDK 10,график гистограммы не обновляется.
Я пробовал Platform.requestNextPulse, но это не помогло.
Извините за плохой английский.
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Rectangle2D;
import javafx.scene.*;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.paint.Color;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.util.Duration;
public class HMIBrowserDemoTest extends Application {
private Scene backScene=new Scene(new Group());
SubScene subScene =null;
private Group picGroup=null;
public HMIBrowserDemoTest(){
super();
}
private void initUI(Stage primaryStage) {
Rectangle2D screenBounds=Screen.getPrimary().getBounds();
primaryStage.setWidth(screenBounds.getWidth());
primaryStage.setHeight(screenBounds.getHeight());
primaryStage.centerOnScreen();
primaryStage.setTitle("hmi.browser.title");
primaryStage.setScene(backScene);
Group rootGroup=(Group) backScene.getRoot();
Group aa=new Group();
aa.getChildren().add(createContent1());
subScene =new SubScene(aa,800,700);
subScene.setFill(Color.BEIGE);
subScene.setManaged(false);
rootGroup.getChildren().add(subScene);
}
@Override
public void start(Stage primaryStage) throws Exception {
initUI(primaryStage);
primaryStage.show();
init1();
}
public static void main(String[] args) {
System.out.println(System.getProperty("java.library.path"));
launch(args);
}
private void init1(){
Timeline tl = new Timeline();
tl.getKeyFrames().add(
new KeyFrame(Duration.millis(150),
new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
XYChart.Series series= (XYChart.Series) chart.getData().get(0);
int value= (int) (Math.random() * 5000);
XYChart.Data<String, Number> data= (XYChart.Data<String, Number>) series.getData().get(0);
System.out.println(value+"-----------");
data.setYValue(value);
subScene.toFront();
}
}
));
tl.setCycleCount(Animation.INDEFINITE);
tl.setAutoReverse(true);
tl.play();
}
private BarChart chart;
private CategoryAxis xAxis;
private NumberAxis yAxis;
public Parent createContent1() {
String[] years = {"2007", "2008", "2009"};
xAxis = new CategoryAxis();
xAxis.setCategories(FXCollections.<String>observableArrayList(years));
yAxis = new NumberAxis("Units Sold", 0.0d, 3000.0d, 1000.0d);
ObservableList<BarChart.Series> barChartData = FXCollections.observableArrayList(
new BarChart.Series("Apples", FXCollections.observableArrayList(
new BarChart.Data(years[0], 567d),
new BarChart.Data(years[1], 1292d),
new BarChart.Data(years[2], 1292d)
)),
new BarChart.Series("Lemons", FXCollections.observableArrayList(
new BarChart.Data(years[0], 956),
new BarChart.Data(years[1], 1665),
new BarChart.Data(years[2], 2559)
)),
new BarChart.Series("Oranges", FXCollections.observableArrayList(
new BarChart.Data(years[0], 1154),
new BarChart.Data(years[1], 1927),
new BarChart.Data(years[2], 2774)
))
);
chart = new BarChart(xAxis, yAxis, barChartData, 25.0d);
chart.setLayoutX(0);
chart.setLayoutY(0);
chart.setPrefSize(300,300);
return chart;
}
}