0

一連のタスク (GUI の更新) をバッチ処理して、毎秒実行したいと考えています。(私は毎秒何百もの更新を行っており、Java FX 2 がフリーズする原因となっています)

    public void update(String price){
        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                priceLabel.setText(price);

            }});
    }

Javaでこれを行う最も簡単な方法は何ですか?

4

2 に答える 2

2

通常、GUI に対するすべての更新はまとめてバッチ処理され、GUI スレッドで処理されます。あなたのアーキテクチャはあなたの本当の問題だと思います。10 ミリ秒ごとにラベルを変更するのは賢明ではありません。Java FX がこれをサポートしていたとしても、ユーザーが目にするのはちらつきだけです。したがって、内部データ モデルを更新し、データ モデルの変更を一定の時間間隔でユーザーに表示することをお勧めします。データ モデルは UI から独立し、バックグラウンド スレッドは2 秒ごとに1 つの更新を UI に送信できます。

于 2012-05-21T08:04:05.467 に答える
0

変化のきっかけは?テキストが何らかのオブジェクトの値にリンクされている場合、バインディングを使用して、オブジェクトの値が変更されたときに GUI の自動更新を取得できます。

または、手動で実行することもできます。例として、以下のコードを参照してください (これは単純化されています。ランナブルを 2 回実行するのを避けるために、おそらくリストをクリアする必要があります。この場合、並行性の問題などに対処する必要があります)。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final List<Runnable> list = new CopyOnWriteArrayList<Runnable>(); //your updates
Runnable updateGui = new Runnable() {

    @Override
    public void run() {
        Platform.runLater(new Runnable() {

            @Override
            public void run() {
                for (Runnable r : list) {
                    r.run();
                }
            }
        });
    }
};

scheduler.scheduleAtFixedRate(updateGui, 0, 1, TimeUnit.SECONDS);

list.add(new Runnable() {

    @Override
    public void run() {
        priceLabel.setText(price);
    }
});
于 2012-05-21T14:17:01.487 に答える