java jprocessbar_Java建立JProgressBar

设置JProgressbar主要有以下几个点:

jpb.setMaximum(100);//设置最大值

jpb.setMinimum(0);//设置最小值

jpb.setValue(0);//设置初始值

jpb.setStringPainted(true);//设置进度条上是否显示进度具体进度如50%

jpb.setPreferredSize(new Dimension(400,50));设置大小,注意不是setsize

还有就是他有一个ChangeListener事件,可以监听进度条的变化。

48304ba5e6f9fe08f3fa1abda7d326ab.png

这是我再百度上看到的那个人得问题,和我的差不多。//如下程序,在运行的时候,本应该进度从0显示到9(每0.1秒进度加1)。//可是为什么结果是:按下“start”后,没反应,经过短暂的时候,直接//显示9?谁能告诉我其中的原因。

import java.awt.*;import java.awt.event.*;import javax.swing.*;public classNewClass

{static JProgressBar jpb=null;static JButton jb=null;public static voidmain(String args[])

{

JFrame frm=newJFrame();

Container contentPane=frm.getContentPane();

jpb=newJProgressBar();

jpb.setOrientation(JProgressBar.HORIZONTAL);

jpb.setMaximum(100);jpb.setMinimum(0);jpb.setValue(0);

jpb.setStringPainted(true);

jpb.setPreferredSize(new Dimension(400,50));

contentPane.add(jpb,BorderLayout.CENTER);

jb=new JButton("Start");

jb.addActionListener(newChange());

contentPane.add(jb,BorderLayout.SOUTH);

frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frm.pack();

frm.setVisible(true);

}static class Change implementsActionListener

{public voidactionPerformed(ActionEvent e)

{for(int i=1;i<10;i++)

{try{

Thread.sleep(100);

jpb.setValue(i);

}catch(InterruptedException ie){}

}

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

解决办法:

因为你的程序是单线程的。当你按下按钮的时候,程序就开始执行那个for循环,直到for循环结束为止,程序的控制权才会返回,这段时间内,程序的控制权都在for循环那里,而那里不会做任何事情,只是在不断的设置一个值,然后睡觉。你注意,这时候界面是死的,进度条根本得不到重新绘制的机会(界面重绘,按钮的响应,都是由同一个线程分发的事件,你现在按钮响应事件中写setValue会在事件队列中添加一个事件,但是你自己还没完成,后续的当然更不可能做了),甚至你可以发现你按下按钮后,按钮保持深色,这表明按钮根本没有弹起来。在做这种时间非常长的事件处理的时候,你要新开一个线程才可以。这样,actionPerformed只是新建了一个线程,他会迅速返回,那么后续的repaint事件也可以及时得到执行,GUI就不会死了~

正确代码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

import java.awt.*;import java.awt.event.*;import javax.swing.*;public classProgressBar

{static JProgressBar jpb=null;static JButton jb=null;public static voidmain(String args[])

{

JFrame frm=newJFrame();

Container contentPane=frm.getContentPane();

jpb=newJProgressBar();

jpb.setOrientation(JProgressBar.HORIZONTAL);

jpb.setMaximum(1000);jpb.setMinimum(0);jpb.setValue(0);

jpb.setStringPainted(true);

jpb.setPreferredSize(new Dimension(400,10));

jpb.setBackground(Color.black);

jpb.setForeground(Color.red);

contentPane.add(jpb,BorderLayout.CENTER);

jb=new JButton("Start");

jb.addActionListener(newChange());

contentPane.add(jb,BorderLayout.SOUTH);

frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frm.pack();

frm.setVisible(true);

}static class Change implementsActionListener {public voidactionPerformed(ActionEvent e) {new Thread(newRunnable() {public voidrun() {for (int i = 900; i >=1; i--) {try{

Thread.sleep(100);

jpb.setValue(i);

}catch(InterruptedException ie) {

}

}

}

}).start();

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值