java - 方法运行时的JProgressBar

时间:2013-05-20 12:57:19

标签: java swing sync swingworker jprogressbar

Find()方法是我的方法的一个示例,它将单词搜索到一些文件中。 我是通过Button_Start鼠标点击事件来称呼的 这是我的代码:

public void Find (String word) {

   List_files_directories (directory.getAbsolutePath(), files);

// print list  
    textpane.append(java.awt.Color.cyan, "Files in the choosen directory\n");

for (int j=0; j<files.size(); j++) { 
       if (files.get(j) != null)
                 textpane.append( java.awt.Color.PINK, "\n" + files.get(j) );
   }

// from listarray to array
    String[] array_files = new String[files.size()];
    array_files = files.toArray(array_files);

int j;        
for (j=0; j<array_files.length; j++) {
if (array_files[j] != null) {   

        if (array_files[j].contains("1")) {
            function1 (  array_files[j], word );
         } 

        else if (     array_files[j].contains("2")   ) 
        {
        function2 (  array_files[j], word);
        } 

        else if (     array_files[j].contains("3")    ) 
       {
        function3 (   array_CARTELLE[j], word  );
        } 

       }            
}        
} 

private void Button_StartMouseClicked(java.awt.event.MouseEvent evt) {                                           
        java.util.Timer().schedule( 
        new java.util.TimerTask() {
            @Override
            public void run() { 
                    Find(word_from_textfield); 
            }
        }, 
        10
);
}

我需要添加两件事:

  1. JProgressBar方法正在运行时,我想制作Find() 在这种情况下,我需要采用一个标准来设置栏的进度 即根据文件列表长度,我不知道。
  2. 我想在WAIT_CURSOR方法正在运行时设置Find(),所以直到 进度条达到100%。
  3. 我为我的请求尝试了这个1):

            public void doWork() {
    
                Worker worker = new Worker();
                worker.addPropertyChangeListener(new PropertyChangeListener() {
                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        if ("progress".equals(evt.getPropertyName())) {
                            ProgressBar1.setValue((Integer) evt.getNewValue());
                        }
                    }
                });
    
               worker.execute();
            }
    
       public class Worker extends SwingWorker<Object, Object> {     
                @Override
                protected Object doInBackground() throws Exception {
    
                    for (int index = 1; index <= 1000; index++) {
                        int progress = Math.round(((float) index / 1000) * 100f);
                        setProgress(progress);
    
                        Thread.sleep(100);
                    }
                    return null;
                }
            }
    

    在此,我在doWork()方法的开头致电Find()。 问题是我不知道如何同步我的方法持续时间和进度条长度。 此外,我不知道这是否是实现目标的最佳途径。

    请你帮我根据我的代码/情况给出一个例子吗?

    由于

    编辑:这是我的目标:我的方法在JTextPanetextpane.append())打印用户目录中的所有文件,然后在每个文件中搜索一个单词。 我想在JrogxtPane上打印时使用JProgressBar,它必须与进程持续时间同步。 如果可能的话必须定时打印: 示例

    // Set Mouse cursor to Wait Status
    // execute Find():
    // the JProgressBar has to follow this progress of the print on JTextPane.
    Files in the choosen directory:
    file1
    // print on JTextPane after 1 second
    file2
    // print on JTextPane after 1 second
    file3
    // print on JTextPane after 1 second
    
    word found in file1!
    // print on JTextPane after 1 second
    word not found in file2
    // print on JTextPane after 1 second
    word found in file3
    // print on JTextPane after 1 second
    // restore mouse cursor to default
    

2 个答案:

答案 0 :(得分:2)

我认为您需要将Find()完成的工作集成到SwingWorker中。然后,您可以在处理完每个文件后设置进度条。

@Override
protected Object doInBackground() throws Exception {

    for (int j=0; j<files.size(); j++) { 
       if (files.get(j) != null)
                 textpane.append( java.awt.Color.PINK, "\n" + files.get(j) );
    }

    // from listarray to array
    String[] array_files = new String[files.size()];
    array_files = files.toArray(array_files);

    int j;        
    for (j=0; j<array_files.length; j++) {
        if (array_files[j] != null) {   

            if (array_files[j].contains("1")) {
                function1 (  array_files[j], word );
            } 

            else if (     array_files[j].contains("2")   ) 
            {
                function2 (  array_files[j], word);
            } 

            else if (     array_files[j].contains("3")    ) 
            {
                function3 (   array_CARTELLE[j], word  );
            } 

        // THIS IS THE NEW BIT
        setProgress((int)(100 * (float) j / files.size()));
    }
} 

答案 1 :(得分:2)

  

什么是publish()?我不明白我必须做什么。

方法publish()process()SwingWorker可以正确地将<{3}} 从后台线程传递到事件派遣线程(EDT)。在此interim results中,process()显示长时间运行计算的当前结果;在此相关的example中,process()也会更新图表的数据模型。

附录:正如@mKorbel所说,您可以通过使用更具体的类型来利用泛型类型检查,例如: SwingWorker<Double, Double>