我阅读了所有类似的主题文章,但我仍然无法弄清楚我的问题。我在这里使用LineChart,我想在滚动时放大/缩小。像这样的代码:
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
DataModel dataModel = new DataModel();
dataModel.getData("value", "value_tbl"); // get data from specified file
IViewFactory viewFactory = new LineViewFactory();
view = viewFactory.create(); // create lineChart view
view.setData(dataModel.getData("value", "value_tbl")); // load data into LineChart, here should be XYChart.Series
this.getCanvas(root).getChildren().addAll(view.getView());
stage.setScene(scene);
curStage = stage;
view.getView().setOnScroll(this.scrollHandler); // set listener
stage.show();
}
这是听众:
EventHandler<ScrollEvent> scrollHandler = new EventHandler<ScrollEvent>(){
@Override
public void handle(ScrollEvent event) {
System.out.println("view scroll");
NumberAxis xAxis = ((LineChartView)view).getXAxis();
xAxis.setLowerBound(xAxis.getLowerBound() + 10);
xAxis.setUpperBound(xAxis.getUpperBound() - 10);
Platform.runLater(new Runnable(){
@Override
public void run() {
curStage.show();
}
});
}
};
日志表示程序会进入侦听器,但LineChart没有变化。
Application中的start()方法和scrollHandler部分。但LineChartView程序在另一个包中。 那么,任何人都可以帮助我指出它不起作用的原因吗?非常感谢你!
我已经阅读了一些可以使用的类似代码,但是有一个很大的不同,所有程序都在应用程序中。
答案 0 :(得分:0)
事件处理程序由JavaFX系统在JavaFX应用程序线程上运行。所以你在JavaFX应用程序线程上(因为你提供的代码没有演示产生任何其他线程),所有的逻辑都在JavaFX应用程序线程上运行,你不需要使用并发实用程序来将逻辑切换到JavaFX应用程序线程;即,Platform.runLater()
的呼叫是不必要的。
如果您不确定自己的线程是什么,可以随时通过调用来找到:
System.out.println("Current thread: " + Thread.currentThread().getName());
对于您的代码,这将始终打印&#34;当前线程:JavaFX应用程序线程&#34;。
至于为什么你的代码不起作用 - 这是与线程无关的一些原因,但是为了确定在你的(新)问题中包含复制问题的mcve,完整的环境细节是可取的。你得到的任何错误或堆栈跟踪的全文。