Java-进度条没有进展
所有的编码运行,我唯一的问题是进度条没有显示值的变化。我设置了这些值,但如果我运行它,则该值集不会显示在进度条上。(吧台没满)Java-进度条没有进展,java,swing,jprogressbar,Java,Swing,Jprogressbar,所有的编码运行,我唯一的问题是进度条没有显示值的变化。我设置了这些值,但如果我运行它,则该值集不会显示在进度条上。(吧台没满) public void logIn(){ 试一试{ while(true){ 计算(); 系统输出打印LN(加载进度); 如果(加载进度
public void logIn(){
试一试{
while(true){
计算();
系统输出打印LN(加载进度);
如果(加载进度<100){
mGUI.pbLoading.setValue(加载进度);
线程睡眠(random.nextInt(5000)+100);
}否则{
mGUI.pbLoading.setValue(100);
打破
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
公共空间计算(){
随机=新随机();
加载进度=加载进度+随机。下一步(9)+1;
}
必须在额外的线程中进行计算。这是因为当前正在运行的线程正在阻止重新绘制UI,直到计算完成。问题不在您发布的代码范围内。我使用您的代码创建了一个工作示例:
package snippet;
import java.util.Random;
public class Snippet {
public class ValueAccepter {
public void setValue(int loadingProgress) {
System.out.println(loadingProgress);
}
}
public class MGUI {
public final ValueAccepter pbLoading = new ValueAccepter();
}
private int loadingProgress;
private Random random;
private MGUI mGUI = new MGUI();
public static void main(String[] args) {
new Snippet().logIn();
}
public void logIn() {
try {
while (true) {
calculate();
System.out.println(loadingProgress);
if (loadingProgress < 100) {
mGUI.pbLoading.setValue(loadingProgress);
Thread.sleep(random.nextInt(5000) + 100);
} else {
mGUI.pbLoading.setValue(100);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void calculate() {
random = new Random();
loadingProgress = loadingProgress + random.nextInt(9) + 1;
}
}
包片段;
导入java.util.Random;
公共类代码段{
公共类价值接受者{
public void setValue(int-loadingProgress){
系统输出打印LN(加载进度);
}
}
公共类MGUI{
公共最终价值接受者pbLoading=新的价值接受者();
}
私有int加载进程;
私有随机;
私有MGUI MGUI=新MGUI();
公共静态void main(字符串[]args){
新代码段().logIn();
}
公共无效登录(){
试一试{
while(true){
计算();
系统输出打印LN(加载进度);
如果(加载进度<100){
mGUI.pbLoading.setValue(加载进度);
线程睡眠(random.nextInt(5000)+100);
}否则{
mGUI.pbLoading.setValue(100);
打破
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
公共空间计算(){
随机=新随机();
加载进度=加载进度+随机。下一步(9)+1;
}
}
我想你的秋千线有问题。确保
mGUI.pbLoading.setValue
按预期返回。必须使用执行图形用户界面操作和计算,否则将无法重新绘制。是Oracle的进度条演示代码似乎在这里阻止了EDT
。阅读,你也需要使用长背景任务。检查一下,完全正确。是固定代码。使用SwingWorker。不,不是真的,进度条需要在EDT上更新,否则会违反api的单线程特性。这项工作需要在一个单独的线程上完成,以免阻塞EDT是的,你是对的,我混淆了两者,将更新我的帖子。不,不是。登录方法是在EDT上下文中执行的,与您的方法不同,它违反了EDT的单线程规则Swing@MadProgrammer如果pbLoading
是一个Swing组件,那么您是对的。在我的示例中,pbLoading不是Swing组件,而且一切都很好。如果我们有更多的Francois代码,我们可以判断线程规则是否被违反。你不必这么做,但这可能是首选方法。但如果我是op,我会问为什么?你还没有解释
package snippet;
import java.util.Random;
public class Snippet {
public class ValueAccepter {
public void setValue(int loadingProgress) {
System.out.println(loadingProgress);
}
}
public class MGUI {
public final ValueAccepter pbLoading = new ValueAccepter();
}
private int loadingProgress;
private Random random;
private MGUI mGUI = new MGUI();
public static void main(String[] args) {
new Snippet().logIn();
}
public void logIn() {
try {
while (true) {
calculate();
System.out.println(loadingProgress);
if (loadingProgress < 100) {
mGUI.pbLoading.setValue(loadingProgress);
Thread.sleep(random.nextInt(5000) + 100);
} else {
mGUI.pbLoading.setValue(100);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void calculate() {
random = new Random();
loadingProgress = loadingProgress + random.nextInt(9) + 1;
}
}