簡體   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