تحديث JProgressBar
-
02-10-2019 - |
سؤال
لا يمكنني تحديث برنامج ProgressBar ... هذا هو رمز بلدي
Thread t=new Thread(new Runnable(){
public void run(){
int i=1;
jProgBar.setMinimum(0);
jProgBar.setMaximum(100);
try {
while(i<=100 || true){
jProgBar.setValue(i);
i++;
Thread.sleep(50);
}
}
catch (InterruptedException ex){
jProgBar.setValue(jProgBar.getMaximum());
}
}
});
t.start();
.... Something code that correctly works
t.interrupt();
يتم تحديث حالة شريط التقدم فقط في نهاية الخيط. هل يستطيع احد مساعدتي؟؟
المحلول 5
شكرا لكم جميعا. لقد حلت بهذه الطريقة
try{
jProgBar.setIndeterminate(true);
jProgBar.setStringPainted(true);
jProgBar.setBorderPainted(true);
new Thread(new Runnable() {
public void run() {
...
// here is code that i've to wait
// after this i stop my jProgressBar
...
jProgBar.setStringPainted(false);
jProgBar.setBorderPainted(true);
jProgBar.setIndeterminate(false);
}
}).start();
}
catch(IllegalStateException ex){
//some code
}
نصائح أخرى
قبل النوم ، أضف مكالمة إلى swingutilties.invokelater () التي تولد خيط لإطلاق النار على repropertychange على شريط التقدم في EDT.
استخدم نموذجًا بدلاً من JProgressBar مباشرة:
DefaultBoundedRangeModel model = new DefaultBoundedRangeModel();
JProgressBar bar = new JProgressBar(model);
// Somewhere else, perhaps in another Thread
model.setValue(i)
المثال التالي يعمل بشكل جيد:
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 100);
frame.setVisible(true);
final DefaultBoundedRangeModel model = new DefaultBoundedRangeModel();
frame.add(new JProgressBar(model));
Thread t = new Thread(new Runnable() {
public void run() {
int i = 1;
model.setMinimum(0);
model.setMaximum(100);
try {
while (i <= 100 || true) {
model.setValue(i);
i++;
Thread.sleep(50);
}
} catch (InterruptedException ex) {
model.setValue(model.getMaximum());
}
}
});
t.start();
Thread.sleep(2000);
t.interrupt();
}
أفضل نصيحة لموقفك هي الاستخدام Swingworker. تحقق من API في http://java.sun.com/javase/6/docs/api/javax/swing/swingworker.html
طريقة عملية التجاوز لتحديث قيمة شريط التقدم (ثم سيتم ذلك بشكل صحيح على EDT)
يمكن الحصول على مزيد من المعلومات في http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
لكل يوجنر ، SwingWorker
هو بالتأكيد ما تريد استخدامه هنا ، أو في أي وقت يتم فيه إنتاج مهمة طويلة الأمد يمكن أن تغلق واجهة المستخدم الرسومية الخاصة بك قبل الانتهاء. برنامج تعليمي كامل حول استخدام أشرطة التقدم مع SwingWorker
متوفر من Sun^H^H^Horacle هنا:
http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html
وضع هذا المقتطف
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jProgBar.repaint();
}
}
بين "i ++" و "thread.sleep ()" يجب القيام بالمهمة. للحصول على تجميع ، Mark Jprogbar كـ "نهائي".