【问题标题】:Java Swing Updating before processingJava Swing 处理前更新
【发布时间】:2010-12-01 08:40:54
【问题描述】:

我有一个小应用程序,目前由一个带有“打开文件”按钮的 JPanel 组成。 一旦用户单击该按钮,就会创建一个新的 JFileChooser,以便用户选择一个文件。

一旦用户选择了一个文件,就会处理这个文件。

我想要做的是在处理文件时将 JPanel 上的文本设置为“处理文件”。

我有这个的所有代码,然后在代码之后,我调用方法来实际处理文件,但是发生的是它先处理文件,然后更新 gui 组件

我该如何解决这个问题?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    如您所见,处理文件意味着 Swing 线程(调用它)正在等待处理完成。所以你需要在一个单独的线程中调用它。

    处理应该与其他东西(包括 GUI 更新)并行运行。完成后,它可以回调另一个组件以指示 GUI 可以更新状态消息(请参阅 SwingUtilities.invokeLater() 并创建适当的 Runnable 来执行此操作)

    【讨论】:

      【解决方案2】:

      您应该在单独的线程中处理该文件。这将允许您用一块石头杀死两只鸟:首先,您的应用程序将更具响应性。其次,标题的变化实际上会发生。

      OTOH,处理多线程有点棘手。特别是,您可能希望在处理线程运行时阻止某些操作,然后您需要在完成后回滚。

      请记住,新线程不能直接执行 GUI 操作:非 GUI 线程必须使用 SwingUtilities.invokeLater() 请求 GUI 线程代表它执行操作。

      【讨论】:

      • 您还可以使用 Swing 应用程序框架中的任务
      • 你能澄清你的“回滚”声明吗?
      • 回滚:您可能希望在处理发生时禁用“打开文件”菜单项。因此,您在启动线程之前执行此操作。处理完成后,您需要重新启用该菜单项。恢复原标题也是一种回滚行为。
      【解决方案3】:

      您应该在另一个线程中而不是在事件调度线程 (EDT) 中处理您的任务。

      public void actionPerformed(ActionEvent e) { 
        statusLabel.setText("Processing File");
      
        new Thread(new Runnable() { 
          public void run() { 
            // do something long task
            SwingUtilities.invokeLater(new Runnable() { 
              public void run() { 
                statusLabel.setText("Done!");
              }
            });
          }
        }).start();
      }
      

      Using a Swing Worker Thread

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        • 2014-07-27
        • 2013-08-07
        • 1970-01-01
        相关资源
        最近更新 更多