package net.codejava.swing.download;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import net.codejava.swing.JFilePicker;
/**
* A Swing application that downloads file from an HTTP server.
* @author www.codejava.net
*
*/
public class SwingFileDownloadHTTP extends JFrame implements
PropertyChangeListener {
private JLabel labelURL = new JLabel("Download URL: ");
private JTextField fieldURL = new JTextField(30);
private JFilePicker filePicker = new JFilePicker("Save in directory: ",
"Browse...");
private JButton buttonDownload = new JButton("Download");
private JLabel labelFileName = new JLabel("File name: ");
private JTextField fieldFileName = new JTextField(20);
private JLabel labelFileSize = new JLabel("File size (bytes): ");
private JTextField fieldFileSize = new JTextField(20);
private JLabel labelProgress = new JLabel("Progress:");
private JProgressBar progressBar = new JProgressBar(0, 100);
public SwingFileDownloadHTTP() {
super("Swing File Download from HTTP server");
// set up layout
setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.WEST;
constraints.insets = new Insets(5, 5, 5, 5);
// set up components
filePicker.setMode(JFilePicker.MODE_SAVE);
filePicker.getFileChooser().setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
buttonDownload.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
buttonDownloadActionPerformed(event);
}
});
fieldFileName.setEditable(false);
fieldFileSize.setEditable(false);
progressBar.setPreferredSize(new Dimension(200, 30));
progressBar.setStringPainted(true);
// add components to the frame
constraints.gridx = 0;
constraints.gridy = 0;
add(labelURL, constraints);
constraints.gridx = 1;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weightx = 1.0;
add(fieldURL, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.weightx = 0.0;
constraints.gridwidth = 2;
constraints.fill = GridBagConstraints.NONE;
add(filePicker, constraints);
constraints.gridy = 2;
constraints.anchor = GridBagConstraints.CENTER;
add(buttonDownload, constraints);
constraints.gridx = 0;
constraints.gridy = 3;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.WEST;
add(labelFileName, constraints);
constraints.gridx = 1;
add(fieldFileName, constraints);
constraints.gridy = 4;
constraints.gridx = 0;
add(labelFileSize, constraints);
constraints.gridx = 1;
add(fieldFileSize, constraints);
constraints.gridx = 0;
constraints.gridy = 5;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.WEST;
add(labelProgress, constraints);
constraints.gridx = 1;
constraints.weightx = 1.0;
constraints.fill = GridBagConstraints.HORIZONTAL;
add(progressBar, constraints);
pack();
setLocationRelativeTo(null); // center on screen
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* handle click event of the Upload button
*/
private void buttonDownloadActionPerformed(ActionEvent event) {
String downloadURL = fieldURL.getText();
String saveDir = filePicker.getSelectedFilePath();
// validate input first
if (downloadURL.equals("")) {
JOptionPane.showMessageDialog(this, "Please enter download URL!",
"Error", JOptionPane.ERROR_MESSAGE);
fieldURL.requestFocus();
return;
}
if (saveDir.equals("")) {
JOptionPane.showMessageDialog(this,
"Please choose a directory save file!", "Error",
JOptionPane.ERROR_MESSAGE);
return;
}
try {
progressBar.setValue(0);
DownloadTask task = new DownloadTask(this, downloadURL, saveDir);
task.addPropertyChangeListener(this);
task.execute();
} catch (Exception ex) {
JOptionPane.showMessageDialog(this,
"Error executing upload task: " + ex.getMessage(), "Error",
JOptionPane.ERROR_MESSAGE);
}
}
void setFileInfo(String name, int size) {
fieldFileName.setText(name);
fieldFileSize.setText(String.valueOf(size));
}
/**
* Update the progress bar's state whenever the progress of download changes.
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("progress")) {
int progress = (Integer) evt.getNewValue();
progressBar.setValue(progress);
}
}
/**
* Launch the application
*/
public static void main(String[] args) {
try {
// set look and feel to system dependent
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
ex.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new SwingFileDownloadHTTP().setVisible(true);
}
});
}
}