进度条线程怎么用java,多线程 进度条 java

场景:java设计形式(2)-观察者模式Swing 多线程事件处理进度条和Observer的一个具体应用

java设计模式(2)--观察者模式Swing 多线程事件处理进度条和Observer的一个具体应用

适合使用环境: 当自身发生改变时,通知其它对象,其他对象会跟着改变。例如:swing中分页的程序,当你点击上一页下一页时需要重新激发事件,从数据库获得新数据时,等。

Swing的事件处理中,对于非常费时的处理如果不用多线程会造成主界面的阻塞,即界面一片白色,这样非常不好的,也是不提倡的,而起用多线程进行事件 处理又面临一个问题即如果通知用户事件处理的进度,是否处理完成,所以最好在处理的过程中给用户一提示,标明处理的进度信息。这种提示可以用进度条的信息 来表示出来,以下就是一个用进度条来标示事件进度的一个简单实例,这个例子中还使用了Observer模式

进度窗口:

package pro;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Observable;

import java.util.Observer;

import javax.swing.JButton;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JProgressBar;

public class Progress extends javax.swing.JDialog implements ActionListener {

/**

*

*/

private static final long serialVersionUID = 1L;

private JProgressBar pro_JPB;

private JPanel btn_JP;

private JButton cancel_JB;

private JLabel show_JL;

NewJFrame jf;

public Progress(NewJFrame frame) {

super(frame, true);

this.jf = frame;

initGUI();

}

set se = new set();

private void initGUI() {

try {

se.addObserver(new setObserver());

BorderLayout thisLayout = new BorderLayout();

getContentPane().setLayout(thisLayout);

{

show_JL = new JLabel();

getContentPane().add(show_JL, BorderLayout.NORTH);

show_JL.setPreferredSize(new java.awt.Dimension(354, 22));

}

{

pro_JPB = new JProgressBar();

pro_JPB.setMinimum(0);

pro_JPB.setMaximum(100);

getContentPane().add(pro_JPB, BorderLayout.CENTER);

pro_JPB.setPreferredSize(new java.awt.Dimension(392, 27));

}

{

btn_JP = new JPanel();

getContentPane().add(btn_JP, BorderLayout.SOUTH);

{

cancel_JB = new JButton();

btn_JP.add(cancel_JB);

cancel_JB.setText(""u53d6"u6d88");

cancel_JB.addActionListener(this);

}

}

this.setBackground(Color.DARK_GRAY.brighter());

this.setUndecorated(true);

this.setSize(392, 90);

this.setLocationRelativeTo(null);

} catch (Exception e) {

e.printStackTrace();

}

}

public void setMinmum(int i) {

pro_JPB.setMinimum(i);

}

public void setMaxmem(int i) {

pro_JPB.setMaximum(i);

}

public void setVal(int i) {

se.setPrice(i);

}

/**

*

* set Class->function:观察者模式的具体应用

* 2007-4-17

*/

class set extends Observable {

private int price;

public int getPrice() {

return price;

}

public void setPrice(int price) {

this.price = price;

setChanged();

notifyObservers(new Integer(price));

}

}

class setObserver implements Observer {

public void update(Observable obj, Object arg) {

if (arg instanceof Integer) {

int i = ((Integer) arg).intValue();

pro_JPB.setValue(i);

show_JL.setText((i - pro_JPB.getMinimum()) * 100

/ (float) (pro_JPB.getMaximum() - pro_JPB.getMinimum())

+ "%");

}

}

}

public void actionPerformed(ActionEvent e) {

jf.setTh_Flag(false);

this.setVisible(false);

}

}

主程序:

package pro;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JPanel;

import javax.swing.WindowConstants;

public class NewJFrame extends javax.swing.JFrame {

/**

*

*/

private static final long serialVersionUID = 1L;

private JPanel cen_JP;

private JButton jb;

public static void main(String[] args) {

NewJFrame inst = new NewJFrame();

inst.setVisible(true);

}

public NewJFrame() {

super();

initGUI();

}

Progress pro;

private void initGUI() {

try {

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

{

cen_JP = new JPanel();

getContentPane().add(cen_JP, BorderLayout.CENTER);

{

jb = new JButton();

cen_JP.add(jb);

jb.setText("jButton1");

jbAction ja = new jbAction();

pro = new Progress(this);

jb.addActionListener(ja);

}

}

pack();

setSize(400, 300);

} catch (Exception e) {

e.printStackTrace();

}

}

boolean th_Flag = true;

class jbAction implements ActionListener {

public void actionPerformed(ActionEvent e) {

pro.setMaxmem(100);

pro.setMinmum(0);

new Thread() {

public void run() {

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

if (!isTh_Flag()) {

setTh_Flag(true);

break;

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

pro.setVal(i);

System.out.println("===" + i);

}

}

}.start();

pro.setVal(0);

pro.setVisible(true);

}

}

public boolean isTh_Flag() {

return th_Flag;

}

public void setTh_Flag(boolean th_Flag) {

this.th_Flag = th_Flag;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值