Java JProgressBar可以通过简单地增加setValue来更新吗?
这是一个家庭作业,我要读入一个文件,并根据用户的选择将所有字符转换为大写或小写。我已经完成了所有这些工作,但我不确定我的进度条是否随着每个字符的写入而更新,或者在文件写入完成时是否跳到100%。我的逻辑是,在写入每个字符后,我递增一个计数器,然后递增一个计数器,因此Java JProgressBar可以通过简单地增加setValue来更新吗?,java,swing,jprogressbar,Java,Swing,Jprogressbar,这是一个家庭作业,我要读入一个文件,并根据用户的选择将所有字符转换为大写或小写。我已经完成了所有这些工作,但我不确定我的进度条是否随着每个字符的写入而更新,或者在文件写入完成时是否跳到100%。我的逻辑是,在写入每个字符后,我递增一个计数器,然后递增一个计数器,因此progressBar.setValue(100*(symbolswrited/totalSymbols))这是我的代码的一部分,它检查字符是否为小写,如果需要,将其转换为大写。我只是在学习,所以请不要对我的代码太苛刻:)谢谢你的评论
progressBar.setValue(100*(symbolswrited/totalSymbols))代码>这是我的代码的一部分,它检查字符是否为小写,如果需要,将其转换为大写。我只是在学习,所以请不要对我的代码太苛刻:)谢谢你的评论
public void writeFileLC(char[] theCharArray)
{
int totalSymbols = theCharArray.length;
int symbolsWritten = 0;
int symbolsConverted = 0;
/*this loop checks to see if the character is upper case and converts
it if needed. Then it writes the characters to the output file via
the output object output*/
for (int i = 0; i < theCharArray.length; i++)
{
if (Character.isUpperCase(theCharArray[i]))
{
try
{
output.format("%c", Character.toLowerCase(theCharArray[i]));
symbolsConverted++;
symbolsWritten++;
Symbols_converted_textfield.setText(String.valueOf(symbolsConverted));
ProgressBar.setValue(100 * (symbolsWritten / totalSymbols));
}//end try block
catch (FormatterClosedException formatterClosedException)
{
JOptionPane.showMessageDialog(this, "Error writing to file",
"Error writing to file", JOptionPane.ERROR_MESSAGE);
}//end catch
}//end if
else
{
try
{
output.format("%c", theCharArray[i]);
symbolsWritten++;
Symbols_converted_textfield.setText(String.valueOf(symbolsConverted));
ProgressBar.setValue(100 * (symbolsWritten / totalSymbols));
}//end try block
catch (FormatterClosedException formatterClosedException)
{
JOptionPane.showMessageDialog(this, "Error writing to file",
"Error writing to file", JOptionPane.ERROR_MESSAGE);
}//end catch
}//end else
}//end for
}//end method writeFileLC
public void writeflec(char[]字符阵列)
{
int totalSymbols=字符长度;
int-symbolswrited=0;
int SYMBOLS=0;
/*此循环检查字符是否为大写并转换
如果需要,它会将字符写入输出文件
输出对象输出*/
for(int i=0;i
这里发生了两件事。第一种是整数除法,因为symbolswrited
和totalSymbols
都是整数。因此,您永远不会从int/int
中获得小数。它将从0跳到1。如果需要,您可以进行演员阵容:
bar.setValue((int)Math.round(
100.0 * ((double)symbolsWritten / (double)totalSymbols)
));
(可以这样做,也可以首先将它们定义为double。如果值在int范围内,则可以在double上使用++
。)
另一种是更新值的方式,因为它应该在上完成。这取决于如何调用这个方法。如果在事件中调用此函数,则需要启动,否则在该过程完成之前不会显示更新
@Override
public void actionPerformed(ActionEvent ae) { // some action event
final String someString = "SoMe StRiNg"; // some String
SwingWorker<Void, Void> task = new SwingWorker<Void, Void>() {
@Override
public Void doInBackground() {
writeFileLC(someString.toCharArray());
return (Void)null;
}
@Override
public void done() {
try {
get();
} catch(Exception e) {
e.printStackTrace(System.err);
}
}
};
task.execute();
}
publish
的响应性通常比invokeLater
稍差,因为它。就我个人而言,我通常使用invokeLater来更新进度条,但我想发布是“应该”的方式
另请参阅有关发布的教程。Radiodef感谢您的回答,但目前我仍无法理解。进度条对我来说是全新的,教练没有给我们任何关于进度条的信息,而且它们不在本周的阅读中,所以我从零开始。上面的代码是从另一个方法调用的,这个方法是通过按下按钮调用的,所以我认为这在技术上是一个动作事件?另外,当我决定使用int除法时,我认为这是可以的,因为值会被截断。对于进度条来说,这不好吗?这并不是说它必须非常准确,是吗?如果它有帮助的话,我添加了一个SwingWorker示例(您也可以使用常规线程,实际上可能更容易)。除非在单独的线程中运行任务,否则更新进度条根本不起作用。使用除法时,截断适用于大数,但您的截断总是介于0和1之间的分数。你可以试试(100*symbolswrited)/totalSymbols
,我想这很管用。
final int progress = (int)Math.round(
100.0 * ((double)symbolsWritten / (double)totalSymbols)
);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
bar.setValue(progress);
}
});