Hướng dẫn sử dụng JProgressBar trong Java Swing

JProgressBar là một component trong Java Swing được sử dụng để hiển thị tiến trình thực thi của một công việc cụ thể. Ngoài ra nó còn thể hiện phần trăm hoàn thành công việc đang được thực thi.

Các khảo sát cho thấy nếu một tác vụ tốn nhiều thời gian sử dụng JProgressBar để hiển thị tiến trình đang thực thi đến đâu sẽ khiến người dùng dễ chịu hơn là ngồi đợi mà không biết tác vụ đang thực thi tới đâu.

Thanh hiển thị tiến trình trên JProgressBar được gọi là thanh tiến trình.

Khởi tạo JProgressBar

JProgressBar cung cấp một số constructor sau:

  • JProgressBar() – Khởi tạo JProgressBar rỗng không chứa văn bản trên đó.
  • JProgressBar(int orientation) – Khởi tạo JProgressBar theo hướng được chỉ định. Nếu tham số truyền vào là SwingConstants.VERTICAL thì thanh tiến trình theo chiều dọc sẽ được khởi tạo, nếu SwingConstants.HORIZONTAL được truyền vào thì thanh tiến trình theo chiều ngang sẽ được khởi tạo.
  • JProgressBar(int min, int max) – Khởi tạo JProgressBar với giá trị nhỏ nhất là lớn nhất.
  • JProgressBar(int orientation, int min, int max) – Khởi tạo JProgressBar theo hướng được chỉ định. Nếu tham số truyền vào là SwingConstants.VERTICAL thì thanh tiến trình theo chiều dọc sẽ được khởi tạo, nếu SwingConstants.HORIZONTAL được truyền vào thì thanh tiến trình theo chiều ngang sẽ được khởi tạo và giá trị nhỏ nhất và lớn nhất được chỉ định.

Một số hàm thông dụng trong JProgressBar:

  • int getMaximum() : Trả về giá trị lớn nhất của thanh tiến trình.
  • int getMinimum() : Trả về giá trị nhỏ nhất của thanh tiến trình.
  • String getString() : Lấy String đại diện cho thanh tiến trình.
  • void setMaximum(int n) : Đặt lại giá trị lớn nhất cho thanh tiến trình.
  • void setMinimum(int n) : Đặt lại giá trị nhỏ nhất cho thanh tiến trình.
  • void setValue(int n) : Đặt giá trị cho thanh tiến trình thành giá trị n.
  • void setString(String s) :  Đặt giá trị đại diện cho thanh tiến trình thành chuỗi S.

Ví dụ tạo JProgessBar tăng giá trị từ 0 đến 100% tự động sử dụng Thread.sleep()vòng lặp while để tăng giá trị.

package com.company;

import javax.swing.*;

class progress extends JFrame {

    // create a frame 
    static JFrame f;

    static JProgressBar b;

    public static void main(String[] args ) {

        // create a frame 
        f = new JFrame("ProgressBar demo");

        // create a panel 
        JPanel p = new JPanel();

        // create a progressbar 
        b = new JProgressBar();

        // set initial value 
        b.setValue(0);

        b.setStringPainted(true);

        // add progressbar 
        p.add(b);

        // add panel 
        f.add(p);

        // set the size of the frame 
        f.setSize(300, 100);
        f.setVisible(true);
        f.setLocationRelativeTo(null);
        fill();
    }

    // function to increase progress 
    public static void fill() {
        int i = 0;
        try {
            while (i <= 100) {
                // fill the menu bar 
                b.setValue(i + 10);

                // delay the threaåd 
                Thread.sleep(1000);
                i += 20;
            }
        } catch (Exception e) {
        }
    }
} 

Output

Tạo thanh JProgressBar theo chiều dọc

Để tạo thanh tiến trình theo chiều dọc chúng ta chỉ cần sử dụng SwingConstants.VERTICAL trong lúc khởi tạo JProgressBar.

package com.company;

import javax.swing.*;

class progress extends JFrame {

    // create a frame 
    static JFrame f;

    static JProgressBar b;

    public static void main(String[] args ) {

        // create a frame 
        f = new JFrame("ProgressBar demo");

        // create a panel 
        JPanel p = new JPanel();

        // create a progressbar 
        b = new JProgressBar(SwingConstants.VERTICAL);

        // set initial value 
        b.setValue(0);

        b.setStringPainted(true);

        // add progressbar 
        p.add(b);

        // add panel 
        f.add(p);

        // set the size of the frame 
        f.setSize(300, 300);
        f.setVisible(true);
        f.setLocationRelativeTo(null);
        fill();
    }

    // function to incråease progress 
    public static void fill() {
        int i = 0;
        try {
            while (i <= 100) {
                // fill the menu bar 
                b.setValue(i + 10);

                // delay the threaåd
                Thread.sleep(4000);
                i += 20;
            }
        } catch (Exception e) {
        }
    }
} 

Output

Đặt chuỗi đại diện cho thanh tiến trình

Ở các ví dụ trên chúng ta thường thấy giá trị mặc định của chuỗi xuất hiện trên thanh tiến trình là phần trăm hoàn thành của tiến trình. Để thay đổi thành một chuỗi giá trị khác, chúng ta có thể setString() method.

package com.company;

import javax.swing.*;

class Progress extends JFrame {

    // create a frame
    static JFrame f;

    static JProgressBar b;

    public static void main(String[] agrv) {

        // create a frame
        f = new JFrame("ProgressBar demo");

        // create a panel
        JPanel p = new JPanel();

        // create a progressbar
        b = new JProgressBar();

        // set initial value
        b.setValue(0);

        b.setStringPainted(true);

        // add progressbar
        p.add(b);

        // add panel
        f.add(p);

        // set the size of the frame
        f.setSize(500, 500);
        f.setVisible(true);

        fill();
    }

    // function to increase progress
    public static void fill() {
        int i = 0;
        try {
            while (i <= 100) {
                // set text accoring to the level to which the bar is filled
                if (i > 30 && i < 70)
                    b.setString("wait for sometime");
                else if (i > 70)
                    b.setString("almost finished loading");
                else
                    b.setString("loading started");

                // fill the menu bar
                b.setValue(i + 10);

                // delay the thread
                Thread.sleep(3000);
                i += 20;
            }
        } catch (Exception e) {
        }
    }
}

Output

 

Xử lý sự kiện trong JProgressBar

Để xử lý sự kiện mỗi khi giá trị của thanh tiến trình thay đổi chúng ta có thể sử dụng addChangeListener() nhận vào một instance của ChangeListener

package com.company;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

class BoundedChangeListener implements ChangeListener {
    public void stateChanged(ChangeEvent changeEvent) {
        Object source = changeEvent.getSource();
        if (source instanceof JProgressBar) {
            JProgressBar theJProgressBar = (JProgressBar) source;
            System.out.println("ProgressBar changed: " + theJProgressBar.getValue());
        } else {
            System.out.println("Something changed: " + source);
        }
    }
}

class ProgressBarStepBoundedChangeListener {

    public static void main(String args[]) throws Exception {
        JFrame frame = new JFrame("Stepping Progress");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JProgressBar aJProgressBar = new JProgressBar(JProgressBar.VERTICAL);
        aJProgressBar.setStringPainted(true);

        aJProgressBar.addChangeListener(new BoundedChangeListener());

        for (int i = 0; i < 10; i++) {
            aJProgressBar.setValue(i++);
            Thread.sleep(100);
        }

        frame.add(aJProgressBar, BorderLayout.NORTH);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}

Nguồn tham khảo

https://www.geeksforgeeks.org/java-swing-jprogressbar/

http://www.java2s.com/Tutorial/Java/0240__Swing/JProgressBar.htm

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x