创建 java swing 应用程序的屏幕部分的最佳策略是什么,它每分钟都会用来自网页的新信息重新绘制自己?(例如雅虎股票报价)谢谢。
问问题
2620 次
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 回答