gpt4 book ai didi

java - 尝试将线程与 JProgressBar 一起使用

转载 作者:行者123 更新时间:2023-12-01 14:17:34 24 4
gpt4 key购买 nike

所以我试图学习如何使用线程,所以我决定制作一个程序,添加一个然后等待 1/2 秒。而线程(我认为我制作正确)刷新进度条的值。所以我不确定我的程序是否出错或者它是否卡在某个地方。所以我在线程中放置了一个 println ,这就是我得到的:

thred
0
1
2
3
4
5
6
7
8
9
10
11 (ect...)

这是我的框架代码:

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.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.border.EmptyBorder;

public class frame extends JFrame implements ActionListener{

private static final long serialVersionUID = 1L;
private JPanel contentPane;

public static void main(String[] args) {
frame f = new frame();
f.setVisible(true);
f.setSize(450,120);
}

/**
* Create the frame.
*/

public JProgressBar bar;

public frame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 449, 120);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

bar = new JProgressBar();
bar.setStringPainted(true);
bar.setBounds(6, 50, 438, 32);
contentPane.add(bar);

JLabel lblNewLabel = new JLabel(
"Percent of for loop completion");
lblNewLabel.setBounds(6, 6, 279, 16);
contentPane.add(lblNewLabel);

JButton btnStart = new JButton("START");
btnStart.setBounds(327, 1, 117, 29);
btnStart.addActionListener(this);
contentPane.add(btnStart);
}

public int i, progress;
public void actionPerformed(ActionEvent e) {
updater u = new updater();

u.start();
for( i =0; i < 100; i++){
progress = i;
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(i);
}

}

}

这就是我认为的线程类:

public class updater extends Thread {

public void run() {
System.out.println("thred");
frame f = new frame();

int p = f.progress;
while (p != 100) {

f.bar.setValue(p);
}
}
}

最佳答案

您正在阻塞事件调度线程。除其他外,它负责处理油漆更新。当您阻塞线程时,就无法进行更新,这意味着您的程序似乎已陷入停滞状态......

public void actionPerformed(ActionEvent e) {
updater u = new updater();
u.start();
// Now blocking, no more repaints or event notifications until you finish...
for( i =0; i < 100; i++){
progress = i;
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(i);
}

}

您遇到的另一个问题是 Swing(在大多数情况下)不是线程安全的。也就是说,预计所有更新以及与 UI 的交互都将仅在 EDT 上下文中发生。

虽然有多种方法可以解决这个问题,但最简单的方法是使用 SwingWorker,它旨在允许您在后台线程中执行代码并重新同步更新安全地连接到用户界面。

看看...

举一些例子。

您可能还想查看Concurrency in Swing了解更多详情

关于java - 尝试将线程与 JProgressBar 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17984206/

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