3

Webページからの新しい情報で毎分自分自身を再描画するJavaSwingアプリケーションの画面部分を作成するための最良の戦略は何ですか?(例えばヤフーの株価)ありがとうございます。

4

5 に答える 5

4

1. GUIスレッドとは別に別のスレッド(つまり、イベントディスパッチャースレッド)を作成します。

2. yahooの在庫を60秒遅れで提供するサービスに電話させ、使用するThread.sleep(60000);

3.電話するrepaint();

編集:

new Thread(new Runnable(){

   public void run(){

    try{
          while (true){

        Thread.sleep(60000);
        yahoo() // CALL TO YAHOO SENSEX 

        repaint();
          }
       }catch(Exception ex){

         }
 }).start();
于 2012-07-07T19:13:05.227 に答える
2

クラスで使用TimerしてTimerTask、定期的に何らかのアクションを実行します。そして、「update」イベントをアプリケーションのview-component(MVC表記)に送信します。

于 2012-07-07T19:13:15.250 に答える
2

新しいスレッドを開始しThread、このスレッドの実行で、以下のサンプルで公開されているように、イベントスタックにイベントを配置できます。GUIの更新はイベントディスパッチスレッドから呼び出されるため、この方法を実装する方が安全です。詳細はこちら

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class SpringcConc {

    final static JLabel label = new JLabel("INITIALIZED ...");

    public static void main(final String[] s) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame myJframe = new JFrame();
                myJframe.add(label);
                myJframe.pack();
                myJframe.setVisible(true);
                instituteThreads();
            }
        });

    }

    protected static void instituteThreads() {
        Thread queryThread1 = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            label.setText("THREAD 1 UPD");
                        }
                    });
                }
            }
        };
        queryThread1.start();
        Thread queryThread2 = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        sleep(750);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            label.setText("THREAD 2 UPD");
                        }
                    });
                }
            }
        };
        queryThread2.start();
    }

}

別のアプローチはタイマーを使用することです:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class SwingTimer {

    public static void main(final String[] args) {
        final JLabel label = new JLabel("INITIALIZED");
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame jFrame = new JFrame();
                jFrame.add(label);
                jFrame.pack();
                jFrame.setVisible(true);
                jFrame.setBounds(200, 200, 100, 50);
            }
        });
        new Timer(500, new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                label.setText("UPDATE 1");
            }
        }).start();
        new Timer(750, new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                label.setText("UPDATE 2");
            }
        }).start();
    }

}
于 2012-07-07T19:38:52.663 に答える
2

ここに示すように、別のスレッドまたはの代わりにjava.util.Timer、を使用javax.swing.Timerしてデータモデルの更新のペースを調整します。利点は、「スイングタイマーのタスクがイベントディスパッチスレッドで実行される」ことです。

画像

于 2012-07-08T02:02:32.830 に答える
1

おそらく、情報をダウンロードして自分自身を再描画する新しいスレッドを使用するのに最適なソリューションです。

于 2012-07-07T19:13:26.930 に答える