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();
}
}
}
Bài liên quan
bạn set action command cho button chưa?
mình thấy khi tạo biến Button
JButton btn = new JButton("Start")
đoạn StringStart
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 khisetValue
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.Đoạn code này tạo ra thread mới chạy song song với main thread.
nên muốn sleep trong thread này chắc là cần
thay
Thread.Sleep()
à bác. em thay như này thì báo lỗi:sau
Thread.currentThread()
không cóSleep()
bác ạ.Đấ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.
em bỏ Luồng ở Main đi cho cũng vẫn bị thế;
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.
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ộ.
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
thank bác nhé, mình sẽ nguyên cứu cái này.