我的 JprogressBar 'pb1' 有问题 - 它不会更新。 我尝试了不同的方法来使其发挥作用,但似乎我找不到哪里出错了。 propertyChangeListener 可能有问题,我不完全确定。
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);
}
});
}
}
最佳答案
你似乎从来没有打电话过setProgress(...)
在您的 Task SwingWorker 内部。如果进度属性从未改变,则调用 getProgress()
不会显示任何更改。
要解决此问题,您必须配置 doInBackGround 来调用 setProgress(...)
随着事情的进展。这将通知任何正在监听工作人员的 PropertyChangeListener。您可能会在处理文件的 while 循环内执行此操作。
顺便说一句,您还有另一个危险的 SwingWorker,它似乎正在发出 Swing 调用,例如 setText(null)
来自 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;
}
};
您不想这样做,请在 EDT 之外进行 Swing 调用。事实上,我认为没有理由在代码中的这个位置使用 SwingWorker,并且有很多理由不这样做。
另外,根据我的评论,您发布了太多与您的问题无关的代码。下次在这里,请通过将代码削减到可编译、运行和显示您的问题的可管理数量的代码来发布更少的代码,sscce 。
关于java - JProgressBar 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19335491/