packagecom.gloomyfish.socket.tutorial.filetransfer;importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.beans.PropertyChangeEvent;importjava.beans.PropertyChangeListener;importjava.io.File;importjava.net.InetSocketAddress;importjava.net.SocketAddress;importjavax.swing.BorderFactory;importjavax.swing.BoxLayout;importjavax.swing.JButton;importjavax.swing.JFileChooser;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JProgressBar;importjavax.swing.JTextField;/*** 我一般写英文注释,偶尔我也会写中文注释,只是觉得写英文
* 注释跟代码比较统一,无他。
*
* @Date 2012-11-30
*@authorfish
**/
public class FileTransferClient extends JFrame implementsActionListener {/****/
private static final long serialVersionUID = 1L;public final static String SEND_CMD = "Send File";public final static int MINIMUM = 0;public final static int MAXIMUM = 100;//public final static String CONNECT_CMD = "Connect";
privateJButton sendFileBtn;privateJTextField serverField;privateJTextField portField;privateJProgressBar bar;publicFileTransferClient() {super("File Transfer Client");
initComponents();
}private voidinitComponents() {
getContentPane().setLayout(newBorderLayout());
JPanel progressPanel= newJPanel();
progressPanel.setLayout(newBoxLayout(progressPanel, BoxLayout.Y_AXIS));
bar= newJProgressBar();
progressPanel.add(bar);
bar.setMinimum(MINIMUM);
bar.setMaximum(MAXIMUM);
JPanel serverSettingPanel= newJPanel();
serverSettingPanel.setLayout(new GridLayout(2,2,5,5));
serverSettingPanel.setBorder(BorderFactory.createTitledBorder("Server Setting"));
serverField= newJTextField();
portField= newJTextField();
serverSettingPanel.add(new JLabel("Server IP/Host:"));
serverSettingPanel.add(serverField);
serverSettingPanel.add(new JLabel("Server Port:"));
serverSettingPanel.add(portField);
sendFileBtn= newJButton(SEND_CMD);
JPanel btnPanel= newJPanel();
btnPanel.setLayout(newFlowLayout(FlowLayout.RIGHT));
btnPanel.add(sendFileBtn);
getContentPane().add(serverSettingPanel, BorderLayout.NORTH);
getContentPane().add(btnPanel, BorderLayout.SOUTH);
getContentPane().add(progressPanel, BorderLayout.CENTER);
sendFileBtn.addActionListener(this);
}
@Overridepublic voidactionPerformed(ActionEvent e) {
String command=e.getActionCommand();if(command.equals(SEND_CMD)) {if(checkNull()) {
JOptionPane.showMessageDialog(this, "Please enter server host and port in order to set up the connection!");return;
}
JFileChooser chooser= newJFileChooser();int status = chooser.showOpenDialog(null);if (status ==JFileChooser.APPROVE_OPTION) {
File f=chooser.getSelectedFile();
SocketAddress address= newInetSocketAddress(getServer(), getPort());
FileTransferTask task= new FileTransferTask(f, address, this);
bar.setValue(0);
task.addPropertyChangeListener(newPropertyChangeListener() {public voidpropertyChange(PropertyChangeEvent evt) {if ("progress".equals(evt.getPropertyName())) {
bar.setValue((Integer) evt.getNewValue());
}
}
});
task.execute();//异步task执行
}
}else{//do nothing
}
}public voidshowSuccess() {
bar.setValue(100);
JOptionPane.showMessageDialog(this, "file send successfully!");
}publicString getServer() {returnserverField.getText().trim();
}public intgetPort() {returnInteger.parseInt(portField.getText().trim());
}/*** make sure the UI already have some correct input information here!!!
*@return
*/
private booleancheckNull() {
String serverName=serverField.getText();
String port=portField.getText();if(serverName == null || serverName.length() == 0 || port == null || port.length() == 0) {return true;
}try{
Integer.parseInt(port);//try to parse it as server port number , validation code.
} catch(NumberFormatException ne) {
ne.printStackTrace();return true;
}return false;
}public static voidmain(String[] args) {
FileTransferClient client= newFileTransferClient();
client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.setSize(400, 400);
client.setResizable(false);//client.pack();
client.setVisible(true);
}
}