干得好,现在我只想知道为什么如果我将while循环中的System.out.println指令添加到while循环中,则同时在Gui中的cmd和Pgbar上都显示了进度?:
while(progress < 99){
System.out.println("into while of PBar Thread progress = "+progress);
if(progress != Path.operationProgress){
operationProgressBar.setValue(progress);
progress = Path.operationProgress;
operationProgressBar.repaint(); } }
需要一些帮助,我无法获取JProgressBar进行更新,我无法使用SwingWorker,我必须解决这个问题。变量Path.operationProgress是来自“
Path”类实例的静态变量,它是从另一个线程更新的,因此我认为PBar和Path实例都在用户的Threads中执行,而不是在EDT中执行。这是进度条的代码:import javax.swing.*; public class Pbar extends Thread { JProgressBar operationProgressBar; public Pbar(JProgressBar operationProgressBar) { this.operationProgressBar = operationProgressBar; } @Override public void run() { int progress = Path.operationProgress; while(progress < 99) { if(progress != Path.operationProgress) { operationProgressBar.setValue(progress); progress = Path.operationProgress; operationProgressBar.repaint(); }}} }
这是启动线程的动作:
private javax.swing.JProgressBar operationProgressBar; private javax.swing.JLabel pathImage; private javax.swing.JButton simulatedAnnelingButton; public class TSPGUI extends javax.swing.JFrame { TSPMG tspInstance; Path p, result; String filename = ""; int neighborHood_Type = 1, i = 0; // ......Constructor Stuff and init() private void
simulatedAnnelingButtonActionPerformed(java.awt.event.ActionEvent evt)
{
Thread sa = new Thread(){@Override public void run(){result =
p.SimulatedAnnealing(neighborHood_Type); 字符串lastCostString =
result.Cost()+“”; lastCostLabel.setText(lastCostString); }}; sa.start();
Pbar pb =新的Pbar(operationProgressBar); pb.start(); } //其他东西…}
我将使用PropertyChangeListener来使退火进度值成为类的“绑定”属性。如果需要,任何观察者都不能遵循此属性。例如:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.event.SwingPropertyChangeSupport;
@SuppressWarnings("serial")
public class TspGui2 extends JPanel {
private static final String ANNEALING_PROGRESS = "Annealing Progress";
private JProgressBar progBar = new JProgressBar(0, 100);
private JLabel valueLabel = new JLabel();
private JButton beginAnnealingBtn = new JButton("Begin Annealing");
private MyAnnealing myAnnealing = new MyAnnealing(this);
public TspGui2() {
beginAnnealingBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
beginAnnealing();
}
});
myAnnealing.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(MyAnnealing.ANNEALING)) {
// be sure this is done on the EDT
SwingUtilities.invokeLater(new Runnable() {
public void run() {
int annealedValue = myAnnealing.getAnnealedValue();
setValue(annealedValue);
if (annealedValue >= MyAnnealing.MAX_ANNEALED_VALUE) {
beginAnnealingBtn.setEnabled(true);
}
}
});
}
}
});
progBar.setString(ANNEALING_PROGRESS);
progBar.setStringPainted(true);
JPanel northPanel = new JPanel(new GridLayout(1, 0));
northPanel.add(beginAnnealingBtn);
northPanel.add(valueLabel);
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(northPanel);
add(progBar);
}
public void setValue(int value) {
valueLabel.setText("Value:" + value);
progBar.setValue(value);
}
public void beginAnnealing() {
beginAnnealingBtn.setEnabled(false);
setValue(0);
myAnnealing.reset();
new Thread(new Runnable() {
public void run() {
myAnnealing.beginAnnealing();
}
}).start();
}
private static void createAndShowGui() {
TspGui2 mainPanel = new TspGui2();
JFrame frame = new JFrame("TspGui2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MyAnnealing {
public static final String ANNEALING = "Annealing";
public static final int MAX_ANNEALED_VALUE = 100;
private SwingPropertyChangeSupport propChangeSupport =
new SwingPropertyChangeSupport(this);
private TspGui2 gui;
private int annealedValue;
public MyAnnealing(TspGui2 gui) {
this.gui = gui;
}
public void addPropertyChangeListener(
PropertyChangeListener listener) {
propChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(
PropertyChangeListener listener) {
propChangeSupport.removePropertyChangeListener(listener);
}
public void reset() {
setAnnealedValue(0);
}
// simulate some long process...
public void beginAnnealing() {
long sleepDelay = 100;
while (annealedValue < MAX_ANNEALED_VALUE) {
setAnnealedValue(annealedValue + 1);
try {
Thread.sleep(sleepDelay);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public int getAnnealedValue() {
return annealedValue;
}
private void setAnnealedValue(int value) {
final int oldValue = this.annealedValue;
this.annealedValue = value;
propChangeSupport.firePropertyChange(ANNEALING, oldValue, annealedValue);
}
}
问题内容: 我正在尝试将JProgressBar添加到我的程序中,但不会更新!仅当原因为100%时,该值才会更改。这是我的方法。 更改进度栏的值位于上述方法的底部。 这就是我所谓的方法。 编辑:以上根本不是问题,问题之一是程序正在使用整数除法而不是十进制。 问题答案: 是一个整数,也是。因此发生的是小数被截断。你应该做什么,就像 这样做是确保将其除以具有十进制功能的数据类型,该数据类型将返回更具包
问题内容: 我无法更新进度条…这是我的代码 进度栏状态仅在线程末尾更新。有人能帮我吗?? 问题答案: 谢谢大家 我这样解决了
问题内容: 我知道该主题已经在许多问题上得到了解答,但仍然无法解决。 我只想 在提取 大型xml文件的 某些内容 时 更新progressBar 。我认为在另一个线程中使用耗时的循环就足够了,但是?。我设法得到的是ProgressBar要么根本不显示,要么在关闭之前最后进行更新。 在启动该应用程序附近的某个地方,我有: 在显示和更新带有JProgressBar的JDialog时: 所以我有这个 m
在将Android Studio升级到0.4.0版本后,我发现了一个新的错误: 我通过gradle-wrapper.properties升级到了Gradle1.9
问题内容: 我想在新的JDialog中创建JProgressBar,它将与主逻辑处于不同的线程中。因此,我可以通过仅创建新的JDialog并通过处置JDialog完成该进度来开始不确定的进度。但这给了我很多时间,因为在出现JDialog之后,直到完成主线程(SwingUtilities)中的逻辑后,它才显示任何组件(包括JProgressBar)。 包含JDialog的线程: JProgres
由于依赖关系冲突,无法完成安装。 正在安装的软件:Android Development Tools 23.0.6.1720515(com.Android.ide.eclipse.ADT.feature.feature.group 23.0.6.1720515) 当前安装的软件:Google App Engine Tools for Android 3.5.1.v201312301719-rel-