Hello堆栈交换器,
我对Java Swing中的进度条有疑问。我认为我的困惑源于我对线程和Swing事件队列的了解不多(尽管我通常了解多线程的含义,但我对Java线程的了解并不多,AWTEventQueue
上到底发生了什么。)
上下文是按下 因此,从输出看,进度条和 如何更改代码,以更新GUI?我尝试理解 这是我的代码:JButton
开始长计算。在计算开始之前,我在JFrame
中制作了一个进度条,我会绘制[JFrame
(尚不计划在何时预定TBH)。然后,我调用doTask()
,它在与动作侦听器相同的线程中运行(我认为是AWTEventThread
??)。 doTask()
运行,将数字输出到控制台。与doTask()
输出混合的是进度条的迭代计数(从动作侦听器启动makeProgressBar()
开始)。AWTEventThread
都在运行,但是JProgressBar
GUI中设置的值从未更新。JProgressBar
教程并在网上搜寻,但是我认为我的问题更多是对Java任务的概念性理解。package problemclass;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class ProblemClass
{
void progressBarButtonClick()
{
JFrame buttonInAFrame = new JFrame();
JPanel buttonInAFramePanel = new JPanel();
JButton clickMe = new JButton("Click me!");
buttonInAFramePanel.add(clickMe);
clickMe.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
JFrame progBarFrame = makeProgressBar();
doTask();
progBarFrame.dispose();
}
});
buttonInAFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
buttonInAFrame.add(buttonInAFramePanel);
buttonInAFrame.pack();
buttonInAFrame.setVisible(true);
}
private void doTask()
{
for(int i = 0; i < 20000; i++)
{
if (i % 100 == 0)
{
System.out.println("TASK iteration " + i);
try
{
Thread.sleep(1000);
}
catch (InterruptedException e) {}
}
}
}
private JFrame makeProgressBar()
{
JFrame progBarFrame = new JFrame();
JPanel progBarPanel = new JPanel();
JProgressBar progressBar = new JProgressBar();
progBarPanel.add(progressBar);
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBar.setIndeterminate(true);
new Thread(new Runnable()
{
public void run()
{
for (int i = 0; i <= 100; i++)
{
final int j = i;
System.out.println("Progress Iteration " + j);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
progressBar.setValue(j);
}
});
try
{
java.lang.Thread.sleep(100);
}
catch(Exception e) { }
}
}
}).start();
progBarFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
progBarFrame.add(progBarPanel);
progBarFrame.pack();
progBarFrame.setVisible(true);
return progBarFrame;
}
public static void main(String[] args)
{
EventQueue.invokeLater(() ->
{
new ProblemClass().progressBarButtonClick();
});
}
}
你好堆栈交换器,我在Java Swing中的进度条有问题。我认为我的困惑源于我对线程和Swing事件队列的理解不足(我对java不太了解...
JFrame progBarFrame = makeProgressBar();
doTask();
不确定您要做什么。