Java JProgressBar不定螺纹

Java JProgressBar不定螺纹,java,swing,nullpointerexception,jprogressbar,swingutilities,Java,Swing,Nullpointerexception,Jprogressbar,Swingutilities,我在创建设置为不确定的JProgressBar时遇到问题。 以下代码是我对JProgressBar的实现,是从另一个类调用/构造的: public class Progress implements Runnable { private JFrame frameProgress; private JProgressBar progressBar; public Progress(String title, String message) { try {

我在创建设置为不确定的
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(这个)
正在做一些事情,
JProgressBar
显示给用户,并在算法运行时工作

我怎样才能做到这一点?我不太了解线程技术,也不在其他论坛上搜索,但我没有找到我的问题的答案

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

编辑:
此时Progress JFrame打开时没有任何内容,算法正在运行。

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

最终,这将打开一个包含进度条的JFrame

    <>我会考虑使用<代码> jCalue<代码>而不是<代码> jFrase/Cult>
  • 我不会强制调整
    JFrame
    的大小,而是调用
    pack()
然后,仍然在EDT上运行(从而阻止所有UI事件,如重新绘制、鼠标单击等),您可以调用
p.start()
,它启动一个
新线程()
,该线程将调用本身调用的
run()

SwingUtilities.invokeLater(new Runnable()
{
  public void run()
  {
    // do nothing, because progress bar is indeterminate
  }
});
这基本上不会做任何事情,除了在EventQueue上推送一个额外的事件,它将在所有当前挂起的事件之后运行。此事件将运行。。。“没什么”,因为你的Runnable是空的。新的线几乎马上就死了。所以所有这些代码都是无用的

仍然在EDT上运行,您可以从GUI调用
boolean successfull=xmlWriter.writeCommonSettings(这是)(顺便说一句,“成功”仅以一个“l”结尾)。这将继续阻止EDT,防止重新绘制,并防止
JProgressBar
自身绘制。最终您将处理JFrame,但由于所有这些代码都在EDT上运行,用户将看不到进度条的大部分内容,UI看起来将冻结

考虑阅读文章(特别是最后一部分的3个重要链接)


使用
SwingWorker
可以帮助您解决这一问题。

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

最终,这将打开一个包含进度条的JFrame

    <>我会考虑使用<代码> jCalue<代码>而不是<代码> jFrase/Cult>
  • 我不会强制调整
    JFrame
    的大小,而是调用
    pack()
然后,仍然在EDT上运行(从而阻止所有UI事件,如重新绘制、鼠标单击等),您可以调用
p.start()
,它启动一个
新线程()
,该线程将调用本身调用的
run()

SwingUtilities.invokeLater(new Runnable()
{
  public void run()
  {
    // do nothing, because progress bar is indeterminate
  }
});
这基本上不会做任何事情,除了在EventQueue上推送一个额外的事件,它将在所有当前挂起的事件之后运行。此事件将运行。。。“没什么”,因为你的Runnable是空的。新的线几乎马上就死了。所以所有这些代码都是无用的

仍然在EDT上运行,您可以从GUI调用
boolean successfull=xmlWriter.writeCommonSettings(这是)(顺便说一句,“成功”仅以一个“l”结尾)。这将继续阻止EDT,防止重新绘制,并防止
JProgressBar
自身绘制。最终您将处理JFrame,但由于所有这些代码都在EDT上运行,用户将看不到进度条的大部分内容,UI看起来将冻结

考虑阅读文章(特别是最后一部分的3个重要链接)


使用
SwingWorker
应该可以帮助您解决这个问题。

您能描述一下当前代码的哪些地方不起作用吗?进度栏没有显示,我得到一个异常:线程“AWT-EventQueue-0”java.lang.NullPointerException位于de.progress$1。run(progress.java:63)位于java.AWT.event.InvocationEvent.dispatch(InvocationEvent.java:251)在java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)在java.awt.EventQueue.access$200(EventQueue.java:103))…好的…没有更多的错误…但是:如果我启动线程,它会打开Progress JFrame,但其中没有内容(没有JProgressBar)…不要添加重要的细节作为注释。并添加信息。请包含一个完整的堆栈跟踪。不再有错误…在这段代码的旧版本中…您能描述一下当前代码的哪些地方不起作用吗?进度条没有显示,我在de.progress$1.run(progress.java:63)的线程“AWT-EventQueue-0”java.lang.NullPointerException中得到一个异常:异常在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)在java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)在java.awt.EventQueue.access$200(EventQueue.java:103))……好的……没有更多的错误……但是:如果我启动线程,它会打开进度JFrame,但没有内容(没有JProgressBar)在其中…不要添加重要的细节作为评论。并添加信息。请包含完整的stacktrace。不再有错误…此代码的旧版本中。。。