1

NullpointerException多くのJavaFXチャートを更新すると、次のようになります。

java.lang.NullPointerException
    at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:366)
    at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:289)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:459)
    at com.sun.javafx.tk.quantum.QuantumToolkit$9.run(QuantumToolkit.java:332)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:17)
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:67)
    at java.lang.Thread.run(Thread.java:744)

JavaFX-Thread は完全にクラッシュします。

Swing ベースのアプリケーションから JavaFX を使用して、10 秒ごとに新しいデータで更新される約 20 のグラフを表示します。そのうちの 2 つは 2 秒ごとに更新されます。すべての更新は Platform.runLater() で実行されます。つまり、10 秒ごとに 20 回の runLaters です。私は、JavaFX-Thread または EventQueue があまりにも多くの runLater でいっぱいになることを読みました。そこで、PLatform.runLater の呼び出しを 10 秒ごとに 3 回に減らし、すべて正常に動作していました。 3 後で実行します。これで、Nullpointer が再び取得されます。Nullpointer は JavaFX-Thread のオーバーロードが原因ですか? それとも、ここに別の問題がありますか?

Platform.runlater で実行されている update メソッドの例を次に示します。

public static void updateBarChart(final ObservableList<XYChart.Series<String, Number>> oldData, final Map<String, Number> newData) {

    Platform.runLater(new Runnable() {

        @Override
        public void run() {
            logger.trace("ChartUpdater.updateBarChart");
            Series<String, Number> series = oldData.get(0);
            ObservableList<Data<String, Number>> listData = series.getData();

            Set<String> keySet = newData.keySet();

            outer: for (String string : keySet) {
                boolean exists = false;

                for (Data<String, Number> data : listData) {
                    if (data.getXValue().equals(string)) {
                        data.setYValue(newData.get(string));

                        Tooltip.install(data.getNode(), new Tooltip(data.getYValue().toString()));
                        exists = true;
                        continue outer;
                    }
                }

                if (!exists) {
                    final Data<String, Number> data = new BarChart.Data<String, Number>(string, newData.get(string));
                    series.getData().add(data);
                    displayLabelForData(data);
                }
            }

            double scale = 1.0;

            if (series.getData().size() == 2) {
                scale = 0.5d;
            }
            else if (series.getData().size() == 1) {
                scale = 0.2d;
            }

            if (scale != 1.0d) {
                for (Data<String, Number> dataObeject : series.getData()) {
                    dataObeject.getNode().setScaleX(scale);
                }
            }
        }
    });
}
4

2 に答える 2

0

問題の原因を特定しました。チャートのほかに、サードパーティのゲージを使用しました。これらが Nullpointer の原因でした。だから私はそれらを蹴った、そしてすべてが今うまくいっている.

于 2013-11-13T08:41:25.187 に答える