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进度条的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad计算总长度插件_超实用的CAD插件
- 下一篇: java美元兑换,(Java实现) 美元