JavaFX无法从非应用程序线程更改UI

时间:2015-01-22 19:32:20

标签: javafx

我阅读了所有类似的主题文章,但我仍然无法弄清楚我的问题。我在这里使用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程序在另一个包中。 那么,任何人都可以帮助我指出它不起作用的原因吗?非常感谢你!

我已经阅读了一些可以使用的类似代码,但是有一个很大的不同,所有程序都在应用程序中。

1 个答案:

答案 0 :(得分:0)

事件处理程序由JavaFX系统在JavaFX应用程序线程上运行。所以你在JavaFX应用程序线程上(因为你提供的代码没有演示产生任何其他线程),所有的逻辑都在JavaFX应用程序线程上运行,你不需要使用并发实用程序来将逻辑切换到JavaFX应用程序线程;即,Platform.runLater()的呼叫是不必要的。

如果您不确定自己的线程是什么,可以随时通过调用来找到:

System.out.println("Current thread: " + Thread.currentThread().getName());

对于您的代码,这将始终打印&#34;当前线程:JavaFX应用程序线程&#34;。

至于为什么你的代码不起作用 - 这是与线程无关的一些原因,但是为了确定在你的(新)问题中包含复制问题的mcve,完整的环境细节是可取的。你得到的任何错误或堆栈跟踪的全文。