30/09/2018, 20:31

Lỗi setValue cho JProgressBar trong java Swing

Sau một thời gian ngồi mò em vẫn chưa tìm được lỗi, lên đây nhờ các cao nhân giúp đỡ. Em có viết một đoạn code GUI về JProgressBar.Khi em click vào Button để setValue cho JProgressBar thì trên giao diện không được up trạng thái trong khi vẫn có in kết quả ở hàm ``System.out.print()```, Nhưng khi chạy xong thì kết quả lại được up vào giao diện.Bác nào đưa ra giải pháp cho em với.
Hình ảnh đang set trạng thái thanh ProgressBar:


Hình ảnh sau khi chạy xong:

Đây là code của em:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Swing;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;

/**
 *
 * @author minhn
 */
import javax.swing.*;

public class JProgressBarDemo implements ActionListener {

    JFrame f;
    JProgressBar pr;
    JButton btn;
    JLabel lb;
    Thread th = new Thread();
    int i = 0;

    JProgressBarDemo() {
        f = new JFrame("ProgressBar");
        f.setSize(300, 200);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(null);

        pr = new JProgressBar(0, 100);
        pr.setStringPainted(true);
        pr.setBounds(10, 30, 150, 20);
        f.add(pr);

        btn = new JButton("Start");
        btn.setBounds(10, 70, 150, 20);
        btn.addActionListener(this);
        lb = new JLabel("Status");

        f.add(btn);
        f.add(lb);
        f.setVisible(true);
      //  this.setvalue();

    }

    public static void main(String[] args) {
     //   new JProgressBarDemo();
        
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JProgressBarDemo();
           //     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        });
    }

    public void setvalueProgress() {
        for (i = 0; i <= 100; i += 10) {
            pr.setValue(i);
            System.out.println(pr.getValue());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(JProgressBarDemo.class.getName()).log(Level.SEVERE, null, ex);
            }
            if (pr.getValue() == 100) {
                JOptionPane.showMessageDialog(null, "Successful");
            }
        }

    }
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Start")) {
            this.setvalueProgress();
           
        }
    }
}
... viết 22:46 ngày 30/09/2018

e.getActionCommand().equals(“Start”)

bạn set action command cho button chưa?

Leng Keng viết 22:34 ngày 30/09/2018

mình thấy khi tạo biến Button JButton btn = new JButton("Start") đoạn String Start là setCommand luôn mà. nếu không setCommand thì khi click Button sao nó chạy được bạn. Đây của mình vẫn chạy nhưng không hiểu sao khi setValue cho Progress lại không thấy up trạng thái trong khi chạy xong 100% mới up trạng thái.

... viết 22:37 ngày 30/09/2018

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JProgressBarDemo();
// throw new UnsupportedOperationException(“Not supported yet.”); //To change body of generated methods, choose Tools | Templates.
}
});

Đoạn code này tạo ra thread mới chạy song song với main thread.

try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(JProgressBarDemo.class.getName()).log(Level.SEVERE, null, ex);
}

nên muốn sleep trong thread này chắc là cần

Thread.currentThread().Sleep(1000);
Leng Keng viết 22:44 ngày 30/09/2018

thay Thread.Sleep() à bác. em thay như này thì báo lỗi:


sauThread.currentThread() không có Sleep() bác ạ.

... viết 22:46 ngày 30/09/2018

Đấy chỉ là ý tưởng thôi. Còn việc bạn dùng current thread như thế nào thì phải tự tìm cách chứ.
http://www.java2s.com/Tutorials/Java/Java_Thread/0040__Java_Thread_Current.htm

Mình đâu có học java đâu mà nhớ đc cú pháp chính xác nó như thế nào.
Cũng không chắc dùng cách này có fix đc vấn đề ban đầu không.

Leng Keng viết 22:43 ngày 30/09/2018

em bỏ Luồng ở Main đi cho cũng vẫn bị thế;

public static void main(String[] args) {
       new JProgressBarDemo();
        
//        SwingUtilities.invokeLater(new Runnable() {
//            @Override
//            public void run() {
//                new JProgressBarDemo();
//           //     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
//            }
//        });
    }

em có để ý khi ấn vào Button thì không thấy Button được nhả. sau khi chạy xong mới thấy Button được nhả ra.

Leng Keng viết 22:40 ngày 30/09/2018

Em thấy bác hay cmt trong Tip về java tưởng bác chuyên java cơ. Có một bác trong diễn đàn chuyên về java mà đang hóng bác ý soi hộ.

... viết 22:38 ngày 30/09/2018

Mình thấy có vấn đề trong việc đưa progressbar ra 1 luồng khác xử lý.

https://docs.oracle.com/javase/tutorial/uiswing/components/progress.html

Thấy ở trong này người ta dùng không liên quan gì đến thread. Giá trị progress bar nó thay đổi theo số task đã hoàn thành. Người ta implements cái property change interface để xác định biến task bị thay đổi.

Chỉ giúp được ngang đó thôi

Leng Keng viết 22:42 ngày 30/09/2018

thank bác nhé, mình sẽ nguyên cứu cái này.

Bài liên quan
0