gpt4 book ai didi

java - JProgressBar 不确定线程

转载 作者:行者123 更新时间:2023-12-01 23:53:43 25 4
gpt4 key购买 nike

我在创 build 置为不确定的 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 会向用户显示,并且在算法运行时正在工作正在运行。

我怎样才能实现这个目标?我对线程了解不多,并在许多其他论坛中进行了搜索,但我没有找到我的问题的任何答案。

请帮助我并提前感谢您;)

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

最佳答案

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

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

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

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

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

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

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

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

考虑阅读Swing tag wiki (尤其是最后一部分,有 3 个重要链接)。

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

关于java - JProgressBar 不确定线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15943621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com