3

创建 java swing 应用程序的屏幕部分的最佳策略是什么,它每分钟都会用来自网页的新信息重新绘制自己?(例如雅虎股票报价)谢谢。

4

5 回答 5

4

1.创建一个与GUI线程分离的线程(即Event Dispatcher Thread)。

2.让它延迟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

代替单独的线程 或java.util.Timer,用于调整数据模型的更新速度,如此javax.swing.Timer所示。优点是“Swing 计时器的任务在事件调度线程中执行”。

图片

于 2012-07-08T02:02:32.830 回答
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();
    }

}

另一种方法是使用Timer

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

Timer与类一起使用以TimerTask定期执行一些操作。并将“更新”事件发送到应用程序的视图组件(以 MVC 表示法)。

于 2012-07-07T19:13:15.250 回答
1

可能是使用新线程的最佳解决方案,下载信息并自行重新绘制..

于 2012-07-07T19:13:26.930 回答