【发布时间】:2012-07-07 20:07:47
【问题描述】:
创建 java swing 应用程序的屏幕部分的最佳策略是什么,它每分钟都使用来自网页的新信息重新绘制自己? (以雅虎股票报价为例) 谢谢。
【问题讨论】:
创建 java swing 应用程序的屏幕部分的最佳策略是什么,它每分钟都使用来自网页的新信息重新绘制自己? (以雅虎股票报价为例) 谢谢。
【问题讨论】:
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();
【讨论】:
invokeLater 来更新GUI 组件,例如here。这样可以更安全地避免并发问题。
使用Timer 和TimerTask 类定期执行一些操作。并将“更新”事件发送到应用程序的视图组件(以 MVC 表示法)。
【讨论】:
您可以启动一个新的Thread,在这个线程执行中,您可以将事件放在事件堆栈上,如下面的示例所示。以这种方式实现更安全,因为将从事件调度线程调用 GUI 更新。更多信息here.
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();
}
}
【讨论】:
run方法中。
不要使用单独的线程或java.util.Timer,而是使用javax.swing.Timer 来调整数据模型的更新速度,如here 所示。优点是“Swing 计时器的任务在事件调度线程中执行。”
【讨论】:
可能是使用新线程的最佳解决方案,该线程下载信息并自行重新绘制..
【讨论】: