繁体   English   中英

JProgressBar不确定线程

[英]JProgressBar indeterminate thread

创建设置为不确定的JProgressBar遇到问题。 以下代码是我对JProgressBar实现,是从另一个类调用/构造的:

public class Progress implements Runnable
{
  private JFrame frameProgress;
  private JProgressBar progressBar;

  public Progress(String title, String message)
  {
    try
    {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception e)
    {
      GlobalVariables.LOGGING_logger.error("Error instatiating progress bar.",
          e);
    }

    UIManager.put("ProgressBar.selectionForeground", Color.black);
    UIManager.put("ProgressBar.selectionBackground", Color.black);

    this.frameProgress = new JFrame(title);
    this.frameProgress.setIconImage(GlobalVariables.GUI_icon.getImage());
    this.frameProgress.setSize(300, 60);
    this.frameProgress.setLocation(16, 16);
    this.progressBar = new JProgressBar();
    this.progressBar.setStringPainted(true);
    this.progressBar.setString(message);
    this.progressBar.setIndeterminate(true);
    this.frameProgress.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.frameProgress.add(this.progressBar);
    this.frameProgress.setResizable(false);
    this.frameProgress.setVisible(true);
  }

  public void start()
  {
    new Thread(this).start();
  }

  public void close()
  {
    this.frameProgress.dispose();
    this.frameProgress = null;
    this.progressBar = null;
  }

  @Override
  public void run()
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        // do nothing, because progress bar is indeterminate
      }
    });
  }
}

此JProgressBar的调用者是以下代码段:

    Progress p = new Progress("bla", "blub");
    p.start();
    boolean successfull = xmlWriter.writeCommonSettingsFromGUI(this);
    p.close();

现在我想要的是xmlWriter.writeCommonSettingsFromGUI(this); 正在执行操作,即JProgressBar已显示给用户并在算法运行时正在运行。

我该如何实现? 我对线程的了解不多,并在许多其他论坛中进行了搜索,但是我的问题没有任何答案。

请帮助我,并提前谢谢;)

编辑:进度JFrame那时没有内容打开,算法正在运行。

您可能正面临Swing的并发问题。 假定以下代码在EDT(事件调度线程)上运行:

Progress p = new Progress("bla", "blub");

最终,这将打开一个带有进度条的JFrame。

  • 我会考虑使用JDialog而不是JFrame
  • 我不会强迫JFrame的大小,而是调用pack()

然后,仍在EDT上运行(从而阻止所有UI事件,例如重画,鼠标单击等),调用p.start() ,它启动一个new Thread() ,后者将调用run()本身来电

SwingUtilities.invokeLater(new Runnable()
{
  public void run()
  {
    // do nothing, because progress bar is indeterminate
  }
});

除了将一个附加事件推送到EventQueue之外,这基本上不会做任何事情,它将在所有当前待处理的事件之后运行。 此事件将运行...“无”,因为您的Runnable只是空的。 新线程几乎立即死亡。 因此,所有这些代码都是无用的。

仍在EDT上继续执行,您将boolean successfull = xmlWriter.writeCommonSettingsFromGUI(this);调用boolean successfull = xmlWriter.writeCommonSettingsFromGUI(this); (顺便说一句,“成功”仅以一个“ l”结尾)。 这将继续阻止EDT,从而防止重新绘制并阻止JProgressBar绘制自身。 最终,您将处置JFrame,但是由于所有这些代码都在EDT上运行,因此用户不会看到太多进度条,并且UI会冻结。

考虑阅读Swing标签Wiki (尤其是带有3个重要链接的最后一部分)。

使用SwingWorker应该可以帮助您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM