JProgressBar更新和线程调度

问题描述 投票:1回答:2

Hello堆栈交换器,

我对Java Swing中的进度条有疑问。我认为我的困惑源于我对线程和Swing事件队列的了解不多(尽管我通常了解多线程的含义,但我对Java线程的了解并不多,AWTEventQueue上到底发生了什么。)

上下文是按下JButton开始长计算。在计算开始之前,我在JFrame中制作了一个进度条,我会绘制[,但不是。出现框架,但只是灰色。在此示例中,按钮上写有“ clickMe”。[在“ clickMe”操作侦听器中,我首先在“运行”子任务中创建并显示JFrame(尚不计划在何时预定TBH)。然后,我调用doTask(),它在与动作侦听器相同的线程中运行(我认为是AWTEventThread ??)。 doTask()运行,将数字输出到控制台。与doTask()输出混合的是进度条的迭代计数(从动作侦听器启动makeProgressBar()开始)。

因此,从输出看,进度条和AWTEventThread都在运行,但是JProgressBar GUI中设置的值从未更新。

如何更改代码,以更新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不太了解...
java multithreading swing jprogressbar
2个回答
0
投票
JFrame progBarFrame = makeProgressBar(); doTask();
不确定您要做什么。

0
投票
就像您一样,我最近在进度条和线程上做了一些工作,直到我意识到它是如此的简单,才发疯。简而言之,这是单击按钮时的代码:
© www.soinside.com 2019 - 2024. All rights reserved.