I put in an adjustable delay to slow things down so you can see the progress. Enter a destination file path, select a source file and press copy.
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Hashtable;
import javax.swing.*;
import javax.swing.event.*;
public class CopyProgress
{
JFileChooser fileChooser;
JProgressBar progressBar;
int delay;
public CopyProgress()
{
fileChooser = new JFileChooser(".");
fileChooser.setControlButtonsAreShown(false);
progressBar = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);
progressBar.setStringPainted(true);
delay = 10;
}
private JPanel getCopyPanel()
{
final JTextField textField = new JTextField(16);
JButton copy = new JButton("copy to file");
copy.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
final File source = fileChooser.getSelectedFile();
final File dest = new File(textField.getText());
copyFile(source, dest);
}
});
// delay in milliseconds with 20 ms increments
final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 50, 5);
slider.setToolTipText("delay");
slider.setMajorTickSpacing(5);
slider.setPaintTicks(true);
slider.setLabelTable(getLabels());
slider.setPaintLabels(true);
slider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
delay = 20 * slider.getValue();
}
});
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(2,2,2,2);
gbc.weightx = 1.0;
gbc.anchor = gbc.EAST;
panel.add(new JLabel("dest file"), gbc);
gbc.anchor = gbc.WEST;
panel.add(textField, gbc);
gbc.anchor = gbc.CENTER;
panel.add(copy, gbc);
gbc.gridy = 1;
gbc.gridwidth = 3;
gbc.fill = gbc.HORIZONTAL;
panel.add(slider, gbc);
return panel;
}
private Hashtable getLabels()
{
Hashtable ht = new Hashtable();
for(int j = 0; j <= 10; j++)
ht.put(new Integer(5*j), new JLabel(String.valueOf(100*j)));
return ht;
}
private void copyFile(final File src, final File dst)
{
final int length = (int)src.length();
new Thread(new Runnable()
{
int total = 0;
public void run()
{
try
{
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
byte[] buffer = new byte[1024];
int len;
while((len = in.read(buffer)) > 0)
{
out.write(buffer, 0, len);
total += len;
progressBar.setValue(total*100/length);
// slow down the action for demonstration
try
{
Thread.sleep(delay);
}
catch(InterruptedException ie)
{
System.err.println("interrupt: " + ie.getMessage());
}
}
in.close();
out.close();
}
catch(IOException ioe)
{
System.err.println("io: " + ioe.getMessage());
}
progressBar.setValue(0);
}
}).start();
}
public static void main(String[] args)
{
CopyProgress cp = new CopyProgress();
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(cp.getCopyPanel(), "North");
f.getContentPane().add(new JScrollPane(cp.fileChooser));
f.getContentPane().add(cp.progressBar, "South");
f.pack();
f.setLocation(200,200);
f.setVisible(true);
}
}