【问题标题】:How to display content that reload itself every minute or so in a Java desktop application?如何在 Java 桌面应用程序中显示每分钟左右重新加载的内容?
【发布时间】:2012-07-07 20:07:47
【问题描述】:

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

【问题讨论】:

    标签: java swing netbeans


    【解决方案1】:

    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();
    

    【讨论】:

    • 你能举个小例子吗?谢谢。
    • java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MainForm().setVisible(true); } });
    • 你可以把我写的代码放到一个方法中..然后在EventQueue.invokeLater之后从main()调用一次,然后它会一直循环..我这里没有添加任何机制停止它..你可以使用布尔值来做到这一点..
    • 请在线程内使用invokeLater 来更新GUI 组件,例如here。这样可以更安全地避免并发问题。
    • @kumar-vivek-mitra 我在为 JLabel 设置值时遇到问题,因为所有操作都来自静态 void main 并且编译器抱怨因为 JLabel 变量不是静态的。任何想法如何克服这个问题?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以启动一个新的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方法中。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-30
          • 2021-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-17
          • 1970-01-01
          • 2014-10-18
          相关资源
          最近更新 更多