SwingWorker和JProgressBar的java问题
我需要将给定的任何图像转换为字节数组以满足加密要求。我正在使用JProgressBar监控所选图像较大时的转换进度:
File p= new File("C:\");
BufferedImage oImg = ImageIO.read(p);
ByteArrayOutputStream ba = new ByteArrayOutputStream();
ImageIO.write(oImg, "jpg", ba);
ba.flush();
ProgressBar pb = new ProgressBar();
Thread thread = new Thread(pb);
thread.join();
pb.fireTask(ba.toByteArray());
我定义了一个使用ProgressBar
的SwingWorker
类,如下所示:
public class ProgressBar extends JPanel implements Runnable {
private JProgressBar progressBar;
private Task task;
private byte[] imgByteArray;
public void run() {
createGUI();
}
// Create the GUI
private void createGUI() {
JFrame frame = new JFrame("Converting...");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new ProgressBar();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
JPanel panel = new JPanel();
progressBar = new JProgressBar(0, 100);
progressBar.setBounds(20, 22, 419, 20);
progressBar.setValue(0);
progressBar.setStringPainted(true);
panel.add(progressBar);
add(panel);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
frame.pack();
frame.setVisible(true);
}
/**
* Firing the Task
*/
public void fireTask(byte[] imgArray) {
System.arraycopy(imgArray, 0, imgByteArray, 0, imgByteArray.length);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
task = new Task();
task.execute();
}
class Task extends SwingWorker<Void, Void> {
@Override
public Void doInBackground() {
for (int i=0; i<=imgByteArray.length; i++){
progressBar.setValue(i);
progressBar.repaint();
try{
Thread.sleep(50);
} catch (InterruptedException err){
}
}
return null;
}
public void done() {
Toolkit.getDefaultToolkit().beep();
setCursor(null); // turn off the wait cursor
}
}
}
不幸的是,这个错误发生了
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ciphers.ProgressBar.fireTask(ProgressBar.java:65)
at ciphers.Images.imageEncryption(Images.java:310)
at ciphers.Images.access$1(Images.java:286)
at ciphers.Images$2.actionPerformed(Images.java:184)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:4
02)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
我不知道我的代码出了什么问题!在编写此代码之前,我阅读了SwingWorker
和JProgressBar
,但我觉得我遗漏了一些东西!我能得到一个有用的提示吗
谢谢:)
# 1 楼答案
你似乎不明白
SwingWorker
做什么SwingWorker
提供了一种方法,通过该方法,您可以在事件调度线程的上下文之外执行长时间运行的任务。这意味着您的程序不会被冻结。使用SwingWorker
(相对于使用简单的Thread
)的好处是,它提供了许多易于使用的方法来将更新重新同步回EDT,EDT缩进以阻止您打破Swing的单线程规则:除了EDT之外,不应在任何线程上创建或修改UI元素请仔细查看Worker Threads and SwingWorker和^{} 和Concurrency in Swing了解更多详细信息