日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 数据库进度条_java进度条

發布時間:2024/7/23 java 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 数据库进度条_java进度条 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

練習JProgressBar結合Timer使用。

代碼如下:

package luojing;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.Timer;

import java.util.TimerTask;

public class NewClass

{

static JProgressBar jpb = null;

static JButton jb = null;

public static void main(String args[])

{

JFrame frm = new JFrame();

Container contentPane = frm.getContentPane();

jpb = new JProgressBar();

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("開始");

jb.addActionListener(new Change());

contentPane.add(jb, BorderLayout.SOUTH);

frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frm.pack();

frm.setTitle("進度條");

// 窗口居中

frm.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - frm.getSize()

.width) / 2,(Toolkit.getDefaultToolkit().getScreenSize().height - frm.getSize().height) / 2);

frm.setVisible(true);

}

static class Change implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

Timer timer = new Timer();

timer.schedule(new mytask(jpb), 100, 100);

jb.setEnabled(false);

// 下面這種方法達不到預定效果,因為線程sleep()時用戶界面也不會響應,只會在actionPerformde()執行結束后才會響應

/*

* for (int i = 0; i <= 100; i++) { try { Thread.sleep(100);

*

* jpb.setValue(i);

*

* } catch (InterruptedException e1) { e1.printStackTrace(); }

*

* }

*/

// 采用新建一個一個線程來執行累加可以達到預定的效果

/*

* new Thread(new Runnable() { public void run() { for (int i = 1; i

* <=100; i++) { try { Thread.sleep(100); jpb.setValue(i); } catch

* (InterruptedException ie) { } } } }).start();

*/

}

}

}

class mytask extends TimerTask

{

JProgressBar jpb = null;

int i = 1;

public mytask(JProgressBar jp)

{

this.jpb = jp;

}

public void run()

{

this.jpb.setValue(i++);

}

}

另附(轉):

為什么進度條在事件處理過程中不更新,而是在完成后,從0%調到100%?

分兩種情況:

1)在AWT事件線程中執行的操作

當 應用程序在事件線程中執行長時間的操作時,會阻塞正常的AWT事件處理,因此阻止了重繪操作的發生。這同常會在下列情況下發生:應用程序響應一個來自用戶 界面的請求時,在連接到一個按鈕或其他GUI組件的事件處理程序中執行任務,任務的內容可能會需要較長時間,使事件線程掛起,直至遠程系統發出答復為止。 當應用程序調用JProgressBar的setValue方法時,進度條可能更新期內部狀態并調用repaint,這樣做會把一個事件放置到AWT事件 隊列中。不幸的是,直至應用程序的事件處理程序完成其處理并把控制權返回到線程的事件處理循環,才能處理該事件。

可以通過調用JComponent的paintImmediately方法來這樣做,該方法有兩種形式:

public void paintImmediately(int x, int y, int width, int height);

public void paintImmediately(Rectangel rect);

例如:

Dimension d = bar.getSize();

Rectangel rect = new Rectangle(0,0, d.width, d.height);

...

bar.setValue(progressValue);

bar.paintImmediately(rect);

...

2)在另一個線程中執行的操作

如 果在一個單獨的線程中執行該操作,當調用進度條的setValue方法,它的更新不會出現任何問題,問題在于,后臺線程必須調用JProgressBar 的setValue。而Swing組件只有在事件線程中才能安全的訪問。因此,從執行實際工作的線程調用setValue方法是不安全的!解決的方法是使 用SwingUtilites的invokeLater方法,讓AWT事件線程稍后進行setValue調用。

例如:

...

SwingUtilities.invokeLater(new Runnable() {

public void run() {

bar.setValue(value);

}

});

...

還有一種可能,不能再線程中改變swing組件,例如,不能從線程調用label.setText,但是可以使用EventQueue類的invokeLater和invokeAndWait方法,以便在事件調度線程中執行該調用程序。

總結

以上是生活随笔為你收集整理的Java 数据库进度条_java进度条的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。