2

我有问题JprogressBar'pb1' - 它不会更新。 我已经尝试了不同的方法使其工作,但似乎我无法找到我要去哪里错了。 propertyChangeListener可能存在问题,我不完全确定。JProgressBar不更新

package one; 

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

import java.beans.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.PrintWriter; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 
import javax.swing.*; 

public class ProgressBar extends JFrame implements ActionListener, PropertyChangeListener { 

    private JButton searchBtn; 
    private JButton displayBtn; 
    private JButton reverseBtn; 
    private JButton ZIPbtn; 
    private JLabel lblPath; 
    private JLabel lblTxt1; 
    private JLabel lblTxt3; 
    private JLabel lblTxt2; 
    private JTextArea txt1; 
    private JScrollPane txtP1; 
    private JTextArea txt2; 
    private JScrollPane txtP2; 
    private JTextArea txt3; 
    private JScrollPane txtP3; 
    private JProgressBar pb1; 
    private JProgressBar pb2; 
    private JProgressBar pb3; 

    private Task task; 
    static File fileArray; 


    class Task extends SwingWorker<Void, Void> { 

     BufferedWriter bwr1 = null; 
     BufferedReader br1w = null; 

     @Override 
     protected Void doInBackground() 
       throws Exception { 

      txt1.setText(null); 
      bwr1 = new BufferedWriter(
        new FileWriter(
          new File(
            "C:\\Users\\Saint\\Documents\\file 1 - reversed.txt"))); 

      BufferedReader br1 = new BufferedReader(
        new FileReader(fileArray)); 
      String line; 
      while ((line = br1.readLine()) != null) { 
       StringBuffer sb1 = new StringBuffer(br1 
         .readLine()); 
       sb1.reverse(); 

       bwr1.write(sb1.toString()); 
      } 

      bwr1.flush(); 

      bwr1.close(); 

      br1.close(); 

      System.out 
        .println("Content of StringBuffer written to File 1."); 

      br1w = new BufferedReader(
        new FileReader(
          "C:\\Users\\Saint\\Documents\\file 1 - reversed.txt")); 

      txt1.read(br1w, 
        "C:\\Users\\Saint\\Documents\\file 1 - reversed.txt"); 

      return null; 
     } 

     protected void done() { 

      Toolkit.getDefaultToolkit().beep(); 
      reverseBtn.setEnabled(true); 
      setCursor(null); //turn off the wait cursor 
      pb1.setValue(100); 
      pb1.setVisible(false); 
     } 

    }; 

    public void actionPerformed(ActionEvent evt) { 
     pb1.setStringPainted(true); 
     pb1.setVisible(true); 

     reverseBtn.setEnabled(false); 
     setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
     task = new Task(); 
     task.addPropertyChangeListener(this); 
     task.execute(); 
    } 

    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
      int progress = task.getProgress(); 
      pb1.setValue(progress); 
      System.out.println(progress); 


    } 

public ProgressBar(){ 

     // construct components 
       searchBtn = new JButton("Search"); 
       reverseBtn = new JButton("Reverse Text"); 
       reverseBtn.setActionCommand("start"); 
       reverseBtn.addActionListener(this); 
       lblTxt1 = new JLabel("File 1"); 

       txt1 = new JTextArea(5, 5); 
       txtP1 = new JScrollPane(txt1); 
       txt1.setLineWrap(true); 

       pb1 = new JProgressBar(0, 100); 


       txtP1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 


       setSize(new Dimension(800, 800)); 
       setLayout(null); 
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       setTitle(""); 


       setResizable(false); 
       pb1.setVisible(false); 
       // pb1.setStringPainted(true); 

       // add components 
       add(searchBtn); 

       add(reverseBtn); 

       add(lblTxt1); 

       add(txtP1); 

       add(pb1); 


       // set component bounds (only needed by Absolute Positioning) 
       searchBtn.setBounds(15, 15, 100, 25); 

       lblTxt1.setBounds(5, 50, 300, 25); 

       txtP1.setBounds(5, 75, 735, 190); 

       reverseBtn.setBounds(300, 730, 150, 25); 

       pb1.setBounds(305, 47, 400, 25); 




     searchBtn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         try { 
          fileChooser(); 
          lblTxt1.setText(fileArray.toString()); 

         } catch (FileNotFoundException e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 
      } 
     }); 

    } 


private String fileChooser() throws FileNotFoundException { 
    // Create a file chooser 
    JFileChooser fc = new JFileChooser(); 
    // Button click response: 
    int returnVal = fc.showOpenDialog(null); 
    if (returnVal == JFileChooser.APPROVE_OPTION) { 
     fileArray = fc.getSelectedFile(); 


    } else { 
     return "No file selected"; 
    } 
    return "No file selected"; 
} 


public static void main(String[] args) { 

    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new ProgressBar().setVisible(true); 
     } 
    }); 
} 
} 
+2

你有很多代码发布的h3ll,其中大部分与你的问题完全无关。请考虑将其削减到一个可管理的数量的代码,编译,运行并显示您的问题,[sscce](http://sscce.org)。 –

+0

@HovercraftFullOfEels - 现在怎么样... – PLG

+0

请参阅答案。 –

回答

4

你永远不会在你的Task SwingWorker里面调用setProgress(...)。如果进度属性不会改变,那么调用getProgress()将不会显示任何更改。

为了解决这个问题,你必须操纵你的doInBackGround,以便在进展中调用setProgress(...)。这将通知任何正在监听worker的PropertyChangeListener。您可能会在处理文件的while循环中执行此操作。


顺便说一句,你有一个似乎正摇摆调用另一个危险的SwingWorker,如setText(null)从withn的doInBackground()方法:

SwingWorker<Void, Void> workerClear = new SwingWorker<Void, Void>() { 

    @Override 
    protected Void doInBackground() throws Exception { 

    txt1.setText(null); 
    txt2.setText(null); 
    txt3.setText(null); 

    return null; 
    } 
}; 

你不想这样做,使摆动从美国东部时间开始。事实上,我没有理由在代码中的这个位置使用SwingWorker,原因很多。


此外,并再次根据我的评论,你张贴太多的代码与你的问题无关。下次在这里,请将您的代码减少到可编辑的代码量,然后编译,运行并显示您的问题,然后发布更少的代码,即sscce

+2

@PLG默认情况下'txt1.setText(null);'doInBackground()里面'永远不会更新 – mKorbel

+0

@PLG:不客气。 –

+0

@Hovercraft Full Of Eels&mKorbel。谢谢你的工作。感谢您的提示。 – PLG

1

在你的情况下更新JprogressBar将取决于任务的长度。您可以使用pb1.setIndeterminate(true);而不是使用pb1.setStringPainted(true);。它不会向您显示已完成任务的确切百分比,但会允许JProgressBar表示该任务在任务持续期间仍在处理中。

+1

我只是想通过测量任务的长度来找出正确的方法。谢谢。我将在未来记住它。 – PLG