我知道这里有很多JProgressBar
问题,但是通过所有答案,我似乎无法诊断出我的问题。我正在使用一些地址验证软件处理文件。我单击“处理”按钮,我需要JProgressBar
更新处理的每个文件。这是按钮:
private JButton getJButton0() {
...
jButton0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
jButton0ActionActionPerformed(event);
t.start();
}
...
根据大家的建议,我setValue()
在一个线程中使用了该方法
Thread t = new Thread(){
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jProgressBar0.setValue(BulkProcessor.getPercentComplete());
}
});
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
...
BulkProcessor.getPercentComplete()
是我从另一个代表完成百分比的类调用的方法。我已经测试了这个方法,它可以正确更新。问题是进度条在文件完成处理之前不会更新,然后会跳转到 100%。如果这是一个重复的问题,我深表歉意,但我在这个网站上做了一些认真的挖掘,但没有运气。非常感谢任何帮助。
编辑:
每个推荐的副本,我试过这个:
public void update(){
new SwingWorker<Void,Void>() {
protected Void doInBackground() throws Exception {
jProgressBar0.setValue(BulkProcessor.getPercentComplete());
return null;
};
}.execute();
}
然后尝试在(用actionPerformed()
切换)下调用这个 update() 方法。我仍然有同样的问题。t.start()
update()
编辑
根据 user1676075 的建议,但同样的问题:
public static void update(){
new SwingWorker<Void,Integer>() {
protected Void doInBackground() throws Exception {
do
{
percentComplete = BulkProcessor.getPercentComplete();
publish(percentComplete);
Thread.sleep(100);
} while(percentComplete < 100);
return null;
}
@Override
protected
void process(List<Integer> progress)
{
jProgressBar0.setValue(progress.get(0));
}
}.execute();
}
编辑
这是我BulkProcessor
班上的代码
private String getOutputLine( String searchString, String inputLine )
throws QasException
{
..(code for processing lines)..
countRecord++;
percentComplete = (int) Math.round((countRecord/totalRecord)*100);
totalRecord
BulkProcessor
在我班的主班更新
public static void main( String input, String output ){
count.clear();
try{
String inputFile = input;
String outputFile = output;
LineNumberReader lnr = new LineNumberReader(new FileReader(new File(input)));
lnr.skip(Long.MAX_VALUE);
totalRecord = lnr.getLineNumber() + 1; //line count in file
BulkProcessor bulk = new BulkProcessor(inputFile, outputFile, ConfigManager.DFLT_NAME);
bulk.process();
}catch(Exception e ){
e.printStackTrace();
}
}