Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JProgressBar可以通过简单地增加setValue来更新吗?_Java_Swing_Jprogressbar - Fatal编程技术网

Java JProgressBar可以通过简单地增加setValue来更新吗?

Java JProgressBar可以通过简单地增加setValue来更新吗?,java,swing,jprogressbar,Java,Swing,Jprogressbar,这是一个家庭作业,我要读入一个文件,并根据用户的选择将所有字符转换为大写或小写。我已经完成了所有这些工作,但我不确定我的进度条是否随着每个字符的写入而更新,或者在文件写入完成时是否跳到100%。我的逻辑是,在写入每个字符后,我递增一个计数器,然后递增一个计数器,因此progressBar.setValue(100*(symbolswrited/totalSymbols))这是我的代码的一部分,它检查字符是否为小写,如果需要,将其转换为大写。我只是在学习,所以请不要对我的代码太苛刻:)谢谢你的评论

这是一个家庭作业,我要读入一个文件,并根据用户的选择将所有字符转换为大写或小写。我已经完成了所有这些工作,但我不确定我的进度条是否随着每个字符的写入而更新,或者在文件写入完成时是否跳到100%。我的逻辑是,在写入每个字符后,我递增一个计数器,然后递增一个计数器,因此
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);
    }
});