gpt4 book ai didi

java - JProgressBar 不在循环内更新

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:43:59 25 4
gpt4 key购买 nike

我目前正在自学Java。我一直在尝试不同的东西,比如 JRadioButtons、JcomboBoxes 等。现在,我正在尝试使用 JProgressBars 但它没有似乎无法正常工作。

相关代码:

JProgressBar progress;
JButton button; //Fields of the class

progress=new JProgressBar(JProgressBar.HORIZONTAL,0,100);
button=new JButton("Done"); //Done from methods

progress.setValue(0);
progress.setStringPainted(true);
progress.setBorderPainted(true); //Also done from methods

button.addActionListener(this); //Also done from methods

单击按钮 时,我想显示 JProgressBar 从 0% 到 100%。以下是 actionPerformed 方法的相关部分:

public void actionPerformed(ActionEvent e)
{

for(int i=0;i<=progress.getMaximum();i++)
{
progress.setValue(i);
/*try{
Thread.sleep(10);
}catch(InterruptedException ex)
{
System.err.println("An error occured:"+ex);
ex.printStackTrace();
}*/
}


progress.setValue(progress.getMinimum());
}

我已将 progressbutton 添加到 JPanel 中,并将面板添加到我使用 setVisible(true); 的 JFrame 中.

这里的问题是,每当我按下 JButton button 时,JProgressBar progress 不会从 0% 变为 100%。相反,什么也没有发生。如果我取消注释 try...catch block ,然后按 button,程序会“卡住”片刻,然后继续。这一次,JProgressBar 也保持在 0%,我从未看到它移动。我还在 try...catch block 之后尝试了 repaint(); 但同样的事情发生了。

我试过添加

System.out.println(i+"");

actionPerformedfor 循环中,这在终端中打印了 0 到 100 的数字。所以,我确定循环会运行。

我该如何解决这个问题?

最佳答案

  • Swing 是单线程的,

  • 所有更新必须在美国东部时间完成,

  • 当前 EDT 中的所有事件都在一瞬间绘制在 GUI 中,

  • Thread.sleep 在 EDT 中锁定事件的执行,重绘可以在 for_loop 结束时绘制,在所有锁定之后 Thread.sleep 被执行,更多在 Oracle trail - Concurency in SwingEventDispatchThread


AWT (Swing) Listener - ActionListener 的输出,如果 actionPerformed 中的所有事件都被执行,则应该完成,然后只执行 progress.setValue( progress.getMinimum());,有没有Thread.sleep都没有关系

public void actionPerformed(ActionEvent e) -> progress.setValue(progress.getMinimum());

  • 使用 SwingWorkerRunnable#Threadprogress.setValue(i); 包裹到 invokeLater

  • 为了获得更好的帮助,请尽快发布 SSCCE/MCVE,简短、可运行、可编译

关于java - JProgressBar 不在循环内更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29727991/

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