歡迎您光臨本站 註冊首頁

Java 文件傳輸助手的實現(單機版)

←手機掃碼閱讀     wooen @ 2020-05-11 , reply:0

項目介紹
用 Java 實現單機版的文件傳輸助手項目。
涉及技術知識:
Swing 組件
I/O流
正則表達式
Java 事務處理機制
基礎功能:
登錄、註冊
發送文字
發送圖片、文件
文字、圖片、文件的信息記錄
歷史記錄的保存、回顯及清空
信息發送的日期
退出
高級功能:
發送表情包
查看和查找歷史記錄
點擊歷史記錄的文件圖片能直接打開
拖拽輸入信息、圖片、文件
功能總覽:
功能實現
一、登錄
進入登錄界面
未輸入賬號,登錄彈出提示
輸入賬號,但未輸入密碼登錄時彈出提示
賬號或者密碼輸入錯誤登錄時彈出提示
登錄成功時進入主界面
登錄界面:
package frame; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; import function.Login; /** * 文件傳輸助手登陸界面 * * @author:360°順滑 * * @date:2020/04/27 * */ public class LoginFrame { public static JFrame loginJFrame; public static JLabel userNameLabel; public static JTextField userNameTextField; public static JLabel passwordLabel; public static JPasswordField passwordField; public static JButton loginButton; public static JButton registerButton; public static void main(String[] args) { // 創建窗體 loginJFrame = new JFrame("文件傳輸助手"); loginJFrame.setSize(500, 300); loginJFrame.setLocationRelativeTo(null); loginJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ImageIcon image = new ImageIcon("src/pictures/logo.png"); loginJFrame.setIconImage(image.getImage()); loginJFrame.setResizable(false); // 創建內容面板 Container container = loginJFrame.getContentPane(); container.setLayout(null); // 創建“賬號”標籤 userNameLabel = new JLabel("賬號:"); userNameLabel.setFont(new Font("行楷", Font.BOLD, 25)); userNameLabel.setBounds(60, 25, 100, 100); container.add(userNameLabel); // 創建輸入賬號文本框 userNameTextField = new JTextField(); userNameTextField.setFont(new Font("黑體", Font.PLAIN, 23)); userNameTextField.setBounds(133, 61, 280, 33); container.add(userNameTextField); // 創建“密碼”標籤 passwordLabel = new JLabel("密碼:"); passwordLabel.setFont(new Font("行楷", Font.BOLD, 25)); passwordLabel.setBounds(60, 90, 100, 100); container.add(passwordLabel); // 創建輸入密碼文本框 passwordField = new JPasswordField(); passwordField.setBounds(133, 127, 280, 33); passwordField.setFont(new Font("Arial", Font.BOLD, 23)); container.add(passwordField); // 創建登錄按鈕 loginButton = new JButton("登錄"); loginButton.setBounds(170, 185, 70, 40); loginButton.setFont(new Font("微軟雅黑", 1, 18)); loginButton.setBackground(Color.WHITE); loginButton.setFocusPainted(false); loginButton.setBorderPainted(false); container.add(loginButton); // 創建註冊按鈕 registerButton = new JButton("註冊"); registerButton.setBounds(282, 185, 70, 40); registerButton.setFont(new Font("微軟雅黑", 1, 18)); registerButton.setBackground(Color.WHITE); registerButton.setFocusPainted(false); registerButton.setBorderPainted(false); container.add(registerButton); // 顯示窗體 loginJFrame.setVisible(true); addListen(); } // 為按鈕添加監聽器 public static void addListen() { // 為登錄按鈕添加監聽事件 loginButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub // 創建Login對象並把LoginFrame的文本框內容作為參數傳過去 Login login = new Login(userNameTextField, passwordField); // 判斷是否符合登錄成功的條件 if (login.isEmptyUserName()) { emptyUserName(loginJFrame); } else { if (login.isEmptyPassword()) { emptyPasswordJDialog(loginJFrame); } else { if (login.queryInformation()) { loginJFrame.dispose(); MainFrame mainFrame = new MainFrame(userNameTextField.getText()); mainFrame.init(); } else { failedLoginJDialog(loginJFrame); } } } } }); // 為註冊按鈕添加監聽事件 registerButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub // 隱藏當前登錄窗口 loginJFrame.setVisible(false); // 打開註冊窗口 new RegisterFrame().init(); } }); } /* * 由於各個標籤長度不同,所以為了界面美觀,就寫了三個彈出對話框而不是一個! * */ // 未輸入賬號時彈出提示對話框 public static void emptyUserName(JFrame jFrame) { JDialog jDialog = new JDialog(jFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocationRelativeTo(null); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel("未輸入賬號!"); jLabel.setFont(new Font("行楷", 0, 21)); jLabel.setBounds(82, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jDialog.dispose(); } }); jDialog.setVisible(true); } // 未輸入密碼時彈出提示對話框 public static void emptyPasswordJDialog(JFrame jFrame) { JDialog jDialog = new JDialog(jFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocationRelativeTo(null); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel("未輸入密碼!"); jLabel.setFont(new Font("行楷", 0, 21)); jLabel.setBounds(82, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jDialog.dispose(); } }); jDialog.setVisible(true); } // 賬號或密碼輸入錯誤! public static void failedLoginJDialog(JFrame jFrame) { JDialog jDialog = new JDialog(jFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocationRelativeTo(null); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel("賬號或密碼輸入錯誤!"); jLabel.setFont(new Font("行楷", 0, 20)); jLabel.setBounds(47, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jDialog.dispose(); } }); jDialog.setVisible(true); } }
登錄判斷
package function; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JPasswordField; import javax.swing.JTextField; /** * 文件傳輸助手登錄功能 * * @author:360°順滑 * * @date: 2020/04/29 * */ public class Login { JTextField userNameTextField; JPasswordField passwordField; public Login(JTextField userNameTextField, JPasswordField passwordField) { this.userNameTextField = userNameTextField; this.passwordField = passwordField; } //判斷賬號是否為空方法 public boolean isEmptyUserName() { if (userNameTextField.getText().equals("")) return true; else return false; } //判斷密碼是否為空方法 public boolean isEmptyPassword() { //操作密碼框文本要先將其轉換為字符串 if ("".equals(new String(passwordField.getPassword()))) return true; else return false; } // 查詢是否存在該賬號密碼 public boolean queryInformation() { File file = new File("src/txt/userInformation.txt"); FileReader fileReader = null; BufferedReader bufferedReader = null; boolean vis = false; try { fileReader = new FileReader(file); bufferedReader = new BufferedReader(fileReader); Pattern userNamePattern = Pattern.compile("用戶名:.+"); Pattern passwordPattern = Pattern.compile("密碼:.+"); String str1 = null; while ((str1 = bufferedReader.readLine()) != null) { Matcher userNameMatcher = userNamePattern.matcher(str1); if(userNameMatcher.find()) { if (("用戶名:" + userNameTextField.getText()).equals(userNameMatcher.group())) { String str2 = bufferedReader.readLine(); Matcher passwordMatcher = passwordPattern.matcher(str2); if(passwordMatcher.find()) { if (("密碼:" + new String(passwordField.getPassword())).equals(passwordMatcher.group())) { vis = true; break; } } } } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fileReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (vis) return true; else return false; } }
主界面
package frame; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.Box; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; import function.DropTargetFile; import function.FileSend; import function.RecordsEcho; import function.TextSend; /** * 文件傳輸助手主界面 * * @author 360°順滑 * * @date:2020/04/29 ~ 2020/04/30 * */ public class MainFrame { String userName; public MainFrame() { }; public MainFrame(String userName) { this.userName = userName; } private JButton fileButton; private JButton historicRecordsButton; private JButton sendButton; private JTextPane showPane; private JTextPane inputPane; private JButton expressionButton; private JScrollPane scrollShowPane; private Box buttonBox; private Box inputBox; private Box sendBox; private Box totalBox; private ImageIcon image; static JFrame mainFrame; public void init() { // 顯示文本窗格 showPane = new JTextPane(); showPane.setSize(600, 400); showPane.setBackground(Color.WHITE); showPane.setEditable(false); showPane.setBorder(null); showPane.setFont(new Font("宋體", 0, 25)); // 顯示文本窗格添加滾動條 scrollShowPane = new JScrollPane(showPane); // 表情包按�o並添加圖標 Icon expressionIcon = new ImageIcon("src/pictures/expression.png"); expressionButton = new JButton(expressionIcon); expressionButton.setBackground(Color.WHITE); expressionButton.setFocusPainted(false); expressionButton.setBorderPainted(false); // 文件按鈕並添加圖標 Icon fileIcon = new ImageIcon("src/pictures/file.png"); fileButton = new JButton(fileIcon); fileButton.setBackground(Color.WHITE); fileButton.setFocusPainted(false); fileButton.setBorderPainted(false); // 歷史記錄按鈕並添加圖標 Icon historicRecordsIcon = new ImageIcon("src/pictures/historicRecords.png"); historicRecordsButton = new JButton(historicRecordsIcon); historicRecordsButton.setBackground(Color.WHITE); historicRecordsButton.setFocusPainted(false); historicRecordsButton.setBorderPainted(false); // 按鈕Box容器添加三個按鈕 buttonBox = Box.createHorizontalBox(); buttonBox.setPreferredSize(new Dimension(1000, 50)); buttonBox.add(Box.createHorizontalStrut(10)); buttonBox.add(expressionButton); buttonBox.add(Box.createHorizontalStrut(10)); buttonBox.add(fileButton); buttonBox.add(Box.createHorizontalStrut(10)); buttonBox.add(historicRecordsButton); // 添加 “歷史記錄”按鈕到右邊框的距離 到buttonBox容器中 buttonBox.add(Box.createHorizontalGlue()); // 輸入文本窗格 inputPane = new JTextPane(); inputPane.setSize(600, 300); inputPane.setFont(new Font("宋體", 0, 24)); inputPane.setBackground(Color.WHITE); JScrollPane scrollInputPane = new JScrollPane(inputPane); // 輸入區域的Box容器 inputBox = Box.createHorizontalBox(); inputBox.setPreferredSize(new Dimension(1000, 150)); inputBox.add(scrollInputPane); // 發送按鈕 sendButton = new JButton("發送(S)"); sendButton.setFont(new Font("行楷", Font.PLAIN, 20)); sendButton.setBackground(Color.WHITE); sendButton.setFocusPainted(false); sendButton.setBorderPainted(false); // 發送Box容器並添加發送按鈕 sendBox = Box.createHorizontalBox(); sendBox.setPreferredSize(new Dimension(1000, 50)); sendBox.setBackground(Color.white); sendBox.add(Box.createHorizontalStrut(710)); sendBox.add(Box.createVerticalStrut(5)); sendBox.add(sendButton); sendBox.add(Box.createVerticalStrut(5)); // 總的Box容器添加以上3個Box totalBox = Box.createVerticalBox(); totalBox.setPreferredSize(new Dimension(1000, 250)); totalBox.setSize(1000, 400); totalBox.add(buttonBox); totalBox.add(inputBox); totalBox.add(Box.createVerticalStrut(3)); totalBox.add(sendBox); totalBox.add(Box.createVerticalStrut(3)); // 設置主窗體 mainFrame = new JFrame("文件傳輸助手"); mainFrame.setSize(950, 800); mainFrame.setLocationRelativeTo(null); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 改變窗體logo image = new ImageIcon("src/pictures/logo.png"); mainFrame.setIconImage(image.getImage()); mainFrame.setLayout(new BorderLayout()); // 添加窗體以上兩個主要容器 mainFrame.add(scrollShowPane, BorderLayout.CENTER); mainFrame.add(totalBox, BorderLayout.SOUTH); mainFrame.setVisible(true); // 添加監聽器 addListen(); // 信息記錄回顯到展示面板 RecordsEcho echo = new RecordsEcho(userName, showPane); echo.read(); } // 提示對話框 public static void warnJDialog(String information) { JDialog jDialog = new JDialog(mainFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocation(770, 400); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel(information); jLabel.setFont(new Font("微軟雅黑", 0, 18)); jLabel.setBounds(65, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); // 為彈出對話框按鈕添加監聽事件 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jDialog.dispose(); } }); jDialog.setVisible(true); } // 添加監聽事件 @SuppressWarnings("unused") public void addListen() { /* * 為輸入文本添加目標監聽器 */ // 創建拖拽目標監聽器 DropTargetListener listener = new DropTargetFile(inputPane); // 在 inputPane上註冊拖拽目標監聽器 DropTarget dropTarget = new DropTarget(inputPane, DnDConstants.ACTION_COPY_OR_MOVE, listener, true); // 發送按鈕監聽事件 sendButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub TextSend textSend = new TextSend(showPane, inputPane, userName); textSend.sendText(); } }); // 輸入框添加鍵盤事件 inputPane.addKeyListener(new KeyListener() { // 發生擊鍵事件時被觸發 @Override public void keyTyped(KeyEvent e) { } // 按鍵被釋放時被觸發 @Override public void keyReleased(KeyEvent e) { } // 按鍵被按下時被觸發 @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub // 如果按下的是 Ctrl + Enter 組合鍵 則換行 if ((e.getKeyCode() == KeyEvent.VK_ENTER) && e.isControlDown()) { Document document = inputPane.getDocument(); try { document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 否則發送 } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { TextSend textSend = new TextSend(showPane, inputPane, userName); textSend.sendText(); } } }); // 表情包按鈕監聽事件 expressionButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub new EmojiFrame(showPane, userName).init(); } }); // 文件按鈕監聽事件 fileButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub FileSend fileSend = new FileSend(userName, showPane, inputPane); fileSend.send(); } }); // 歷史記錄按鈕監聽事件 historicRecordsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub new HistoricRecordsFrame(userName, showPane).init(); } }); } }
登錄之前如果沒有賬號就得先註冊一個,那麼進入註冊功能!
二、註冊
點擊登錄界面的註冊按鈕,進入註冊界面
未輸入賬號進行註冊時
輸入賬號但未輸入密碼或者確認密碼進行註冊時
密碼和確認密碼不一致時進行註冊
賬號已存在進行註冊時
註冊成功時
點擊確定按鈕或者關閉窗口後返回登錄界面
如果取消註冊,直接點擊返回按鈕就可以返回登錄界面了
註冊界面
package frame; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; import function.Register; /** * * 文件傳輸助手註冊界面 * * @author 360°順滑 * * @date: 2020/04/27 ~ 2020/04/28 * */ public class RegisterFrame { public JFrame registerJFrame; public JLabel userNameLabel; public JTextField userNameTextField; public JLabel passwordLabel; public JPasswordField passwordField; public JLabel passwordAgainLabel; public JPasswordField passwordAgainField; public JButton goBackButton; public JButton registerButton; public void init() { // 創建窗體 registerJFrame = new JFrame("文件傳輸助手"); // registerJFrame.setTitle(); registerJFrame.setSize(540, 400); registerJFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); ImageIcon image = new ImageIcon("src/pictures/logo.png"); registerJFrame.setIconImage(image.getImage()); registerJFrame.setLocationRelativeTo(null); registerJFrame.setResizable(false); // 創建內容面板 Container container = registerJFrame.getContentPane(); container.setLayout(null); // 創建“賬號”標籤 userNameLabel = new JLabel("賬號:"); userNameLabel.setFont(new Font("行楷", Font.BOLD, 25)); userNameLabel.setBounds(97, 25, 100, 100); container.add(userNameLabel); // 創建輸入賬號文本框 userNameTextField = new JTextField(); userNameTextField.setFont(new Font("黑體", Font.PLAIN, 23)); userNameTextField.setBounds(170, 61, 280, 33); container.add(userNameTextField); // 創建“密碼”標籤 passwordLabel = new JLabel("密碼:"); passwordLabel.setFont(new Font("行楷", Font.BOLD, 25)); passwordLabel.setBounds(97, 90, 100, 100); container.add(passwordLabel); // 創建輸入密碼文本框 passwordField = new JPasswordField(); passwordField.setBounds(170, 125, 280, 33); passwordField.setFont(new Font("Arial", Font.BOLD, 23)); container.add(passwordField); // 創建“確認密碼”標籤 passwordAgainLabel = new JLabel("確認密碼:"); passwordAgainLabel.setFont(new Font("行楷", Font.BOLD, 25)); passwordAgainLabel.setBounds(45, 150, 130, 100); container.add(passwordAgainLabel); // 創建確認密碼文本框 passwordAgainField = new JPasswordField(); passwordAgainField.setBounds(170, 185, 280, 33); passwordAgainField.setFont(new Font("Arial", Font.BOLD, 23)); container.add(passwordAgainField); // 創建返回按鈕 goBackButton = new JButton("返回"); goBackButton.setBounds(200, 260, 70, 40); goBackButton.setFont(new Font("微軟雅黑", 1, 18)); goBackButton.setBackground(Color.WHITE); goBackButton.setFocusPainted(false); goBackButton.setBorderPainted(false); container.add(goBackButton); // 創建註冊按鈕 registerButton = new JButton("註冊"); registerButton.setBounds(330, 260, 70, 40); registerButton.setFont(new Font("微軟雅黑", 1, 18)); registerButton.setBackground(Color.WHITE); registerButton.setFocusPainted(false); registerButton.setBorderPainted(false); container.add(registerButton); // 顯示窗體 registerJFrame.setVisible(true); addListen(); } // 為按鈕添加監聽事件 public void addListen() { // 為註冊按鈕添加監聽事件 registerButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub // 創建register對象,同時將RegisterFrame的文本框內容作為參數傳過去 Register register = new Register(userNameTextField, passwordField, passwordAgainField); // 判斷輸入賬號是否為空 if (register.isEmptyUserName()) { emptyUserName(registerJFrame); } else { // 判斷輸入密碼是否為空 if (register.isEmptyPassword()) { emptyPasswordJDialog(registerJFrame); } else { // 判斷密碼和確認密碼是否一致 if (register.isSamePassWord()) { // 判斷賬號是否已存在 if (!register.isExistAccount()) { // 註冊成功!!! register.saveInformation(); registerJFrame.dispose(); userNameTextField.setText(""); passwordField.setText(""); passwordAgainField.setText(""); new LoginFrame(); LoginFrame.loginJFrame.setVisible(true); successRegisterJDialog(registerJFrame); } else existAccountJDialog(registerJFrame); } else { differentPasswordJDialog(registerJFrame); passwordField.setText(""); passwordAgainField.setText(""); } } } } }); // 為返回按鈕添加監聽事件 goBackButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 銷燬註冊窗口 registerJFrame.dispose(); // 重新顯示登錄窗口 new LoginFrame(); LoginFrame.loginJFrame.setVisible(true); } }); } /* * 由於各個標籤長度不同,所以為了界面美觀,就寫了三個彈出對話框而不是一個! * */ // 未輸入賬號時彈出提示對話框 public void emptyUserName(JFrame jFrame) { JDialog jDialog = new JDialog(jFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocationRelativeTo(null); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel("未輸入用戶名!"); jLabel.setFont(new Font("行楷", 0, 21)); jLabel.setBounds(73, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jDialog.dispose(); } }); jDialog.setVisible(true); } // 未輸入密碼時彈出提示對話框 public void emptyPasswordJDialog(JFrame jFrame) { JDialog jDialog = new JDialog(jFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocationRelativeTo(null); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel("未輸入密碼!"); jLabel.setFont(new Font("行楷", 0, 21)); jLabel.setBounds(73, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jDialog.dispose(); } }); jDialog.setVisible(true); } // 密碼和確認密碼不一致時彈出提示框 public void differentPasswordJDialog(JFrame jFrame) { JDialog jDialog = new JDialog(jFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocationRelativeTo(null); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel("輸入密碼不一致!"); jLabel.setFont(new Font("行楷", 0, 21)); jLabel.setBounds(63, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jDialog.dispose(); } }); jDialog.setVisible(true); } // 已存在賬號彈出提示對話框 public void existAccountJDialog(JFrame jFrame) { JDialog jDialog = new JDialog(jFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocationRelativeTo(null); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel("該賬號已存在!"); jLabel.setFont(new Font("行楷", 0, 21)); jLabel.setBounds(73, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jDialog.dispose(); } }); jDialog.setVisible(true); } // 成功註冊對話框 public void successRegisterJDialog(JFrame jFrame) { JDialog jDialog = new JDialog(jFrame, "提示"); jDialog.setLayout(null); jDialog.setSize(300, 200); jDialog.setLocationRelativeTo(null); ImageIcon image = new ImageIcon("src/pictures/warn.png"); jDialog.setIconImage(image.getImage()); JLabel jLabel = new JLabel("註冊成功!"); jLabel.setFont(new Font("行楷", 0, 21)); jLabel.setBounds(73, 0, 200, 100); jDialog.add(jLabel); JButton button = new JButton("確定"); button.setBounds(105, 80, 70, 40); button.setFont(new Font("微軟雅黑", 1, 18)); button.setBackground(Color.WHITE); button.setFocusPainted(false); button.setBorderPainted(false); jDialog.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub // 銷燬提示對話框 jDialog.dispose(); } }); jDialog.setVisible(true); } }
註冊判斷
package function; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JPasswordField; import javax.swing.JTextField; /** * 文件傳輸助手註冊功能 * * @author:360°順滑 * * @date:2020/04/28 ~ 2020/04/29 * */ public class Register { JTextField userNameTextField; JPasswordField passwordField; JPasswordField passwordAgainField; //將RegisterFrame參數傳入進來 public Register(JTextField userNameTextField, JPasswordField passwordField, JPasswordField passwordAgainField) { this.userNameTextField = userNameTextField; this.passwordField = passwordField; this.passwordAgainField = passwordAgainField; } //判斷賬號是否為空方法 public boolean isEmptyUserName() { if (userNameTextField.getText().equals("")) return true; else return false; } //判斷密碼是否為空方法 public boolean isEmptyPassword() { //操作密碼框文本要先將其轉換為字符串 if ("".equals(new String(passwordField.getPassword())) || "".equals(new String(passwordAgainField.getPassword()))) return true; else return false; } //判斷密碼和輸入密碼是否一致方法 public boolean isSamePassWord() { //操作密碼框文本要先將其轉換為字符串 if (new String(passwordField.getPassword()).equals(new String(passwordAgainField.getPassword()))) return true; else return false; } //判斷賬號是否已存在方法 public boolean isExistAccount() { File file = new File("src/txt/userInformation.txt"); FileReader fileReader = null; BufferedReader bufferedReader = null; boolean vis = false; try { fileReader = new FileReader(file); bufferedReader = new BufferedReader(fileReader); //正則表達式 Pattern pattern = Pattern.compile("用戶名:.+"); String str = null; while ((str = bufferedReader.readLine()) != null) { Matcher matcher = pattern.matcher(str); if (matcher.find()) { if (("用戶名:" + userNameTextField.getText()).equals(matcher.group())) { vis = true; break; } } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } if (fileReader != null) { try { fileReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } if (!vis) { return false; } else { return true; } } //保存信息到本地 public void saveInformation() { File file = new File("src/txt/userInformation.txt"); FileWriter fileWriter = null; BufferedWriter bufferedWriter = null; try { fileWriter = new FileWriter(file, true); bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write("用戶名:" + userNameTextField.getText()); bufferedWriter.newLine(); bufferedWriter.write("密碼:" + new String(passwordField.getPassword())); bufferedWriter.newLine(); bufferedWriter.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (bufferedWriter != null) { try { bufferedWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fileWriter != null) { try { fileWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
三、發送文字
輸入文字後可以點擊發送按鈕發送,也可以通過鍵盤Enter鍵發送
發送空白信息時彈出提示,提示框代碼在主界面類裡
發送文本:
package function; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JFrame; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; import frame.MainFrame; /** * 實現發送消息,並保存到信息記錄 * * @author 360°順滑 * * @date 2020/05/01 * */ public class TextSend { JFrame mainFrame; JTextPane textShowPane; JTextPane textInputPane; String userName; public TextSend(JTextPane textShowPane, JTextPane textInputPane, String userName) { this.textShowPane = textShowPane; this.textInputPane = textInputPane; this.userName = userName; } public void sendText() { if (!("".equals(textInputPane.getText()))) { // 獲取日期並設置日期格式 Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); SimpleAttributeSet attributeSet = new SimpleAttributeSet(); // 輸入文本 String inputText = dateFormat.format(date) + "
"; Pattern pattern = Pattern.compile(".+[\.].+"); Matcher matcher = pattern.matcher(textInputPane.getText()); // 判斷是否為文件 boolean isFile = false; // 判斷是否為第一個文件 boolean isFirst = true; while (matcher.find()) { isFile = true; // 獲得文件名 int index = matcher.group().lastIndexOf("\"); String fileName = matcher.group().substring(index + 1); // 圖片的情況 if (matcher.group().endsWith(".png") || matcher.group().endsWith(".jpg") || matcher.group().endsWith(".jpeg") || matcher.group().endsWith("gif")) { Document document = textShowPane.getDocument(); try { if (isFirst) { isFirst = false; document.insertString(document.getLength(), inputText, new SimpleAttributeSet()); new RecordsEcho(userName, textShowPane).writeImage(matcher.group(), fileName); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } else { new RecordsEcho(userName, textShowPane).writeImage(matcher.group(), fileName); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else {// 文件的情況 Document document = textShowPane.getDocument(); try { if (isFirst) { isFirst = false; document.insertString(document.getLength(), inputText, new SimpleAttributeSet()); new RecordsEcho(userName, textShowPane).writeFile(matcher.group(), fileName); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } else { new RecordsEcho(userName, textShowPane).writeFile(matcher.group(), fileName); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } if (!isFile) { // 實現發送文本太長自動換行 String str = ""; for (int i = 0; i < textInputPane.getText().length(); i++) { if (i != 0 && i % 15 == 0) str += "
"; str += textInputPane.getText().charAt(i); } Document document = textShowPane.getDocument(); try { document.insertString(document.getLength(), inputText + str + "
", attributeSet); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 把信息保存到對應的用戶本地歷史記錄txt文件 SaveRecords records = new SaveRecords(userName, inputText + textInputPane.getText() + "
"); records.saveRecords(); textInputPane.setText(""); } else { new MainFrame(); MainFrame.warnJDialog("不能發送空白信息!"); } } }
其實這個類不單單只是發送文本這麼簡單,因為後續實現了拖拽發送文件,拖拽後會在輸入框自動輸入文件路徑,實現的代碼有關聯,就寫在這裡了。
四、發送圖片 、文件和表情包
圖片文件的發送主要是通過打開本地瀏覽發送的
發送文件、圖片、表情包:
package function; import java.awt.Color; import java.awt.Desktop; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; /** * 實現打開文件按鈕發送圖片文件表情包 * * @author 360°順滑 * * @date 2020/05/01 */ public class FileSend { String userName; String path; String fileName; JTextPane textShowPane; JTextPane textInputPane; public FileSend() {}; public FileSend(String userName, JTextPane textShowPane, JTextPane textInputPane) { this.userName = userName; this.textShowPane = textShowPane; this.textInputPane = textInputPane; } // 彈出選擇框並判斷髮送的是文件還是圖片 public void send() { // 點擊文件按鈕可以打開文件選擇框 JFileChooser fileChooser = new JFileChooser(); int result = fileChooser.showOpenDialog(null); if (result == JFileChooser.APPROVE_OPTION) { // 被選擇文件路徑 path = fileChooser.getSelectedFile().getAbsolutePath(); // 被選擇文件名稱 fileName = fileChooser.getSelectedFile().getName(); // 選擇的是圖片 if (path.endsWith(".png") || path.endsWith(".jpg") || path.endsWith(".gif") || path.endsWith(".jpeg")) { sendImage(path, fileName); } else { sendFile(path, fileName); } } } // 發送圖片 public void sendImage(String path, String fileName) { // 獲取圖片 ImageIcon imageIcon = new ImageIcon(path); // 如果圖片比整個界面大則調整大小 int width, height; if (imageIcon.getIconWidth() > 950 || imageIcon.getIconHeight() > 400) { width = 600; height = 250; } else { width = imageIcon.getIconWidth(); height = imageIcon.getIconHeight(); } // 設置圖片大小 imageIcon.setImage(imageIcon.getImage().getScaledInstance(width, height, 0)); // 獲取日期 Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM--dd HH:mm:ss"); String input = dateFormat.format(date) + "
"; // 為圖片名稱添加按鈕,用於打開圖片 JButton button = new JButton(fileName); button.setFont(new Font("宋體", Font.PLAIN, 20)); button.setBackground(Color.WHITE); button.setBorderPainted(false); button.setFocusPainted(false); // 獲取整個展示面板的內容,方便圖片文件的插入 Document document = textShowPane.getDocument(); try { // 插入日期 document.insertString(document.getLength(), input, new SimpleAttributeSet()); // 插入圖片 textShowPane.insertIcon(imageIcon); // 換行 document.insertString(document.getLength(), "
", new SimpleAttributeSet()); // 插入按鈕,也就是圖片名稱 textShowPane.insertComponent(button); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 為按鈕添加點擊事件 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub try { // 實現打開文件功能 File file = new File(path); Desktop.getDesktop().open(file); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } }); // 輸入框重新清空 textInputPane.setText(""); // 保存路徑到對應的賬號信息裡 String saveText = input + path + "
"; SaveRecords records = new SaveRecords(userName, saveText); records.saveRecords(); } // 發送文件 public void sendFile(String path, String fileName) { // 獲取固定文件圖標 Icon fileImage = new ImageIcon("src/pictures/document.png"); // 獲取日期 Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String input = dateFormat.format(date) + "
"; // 為名稱添加按鈕 JButton button = new JButton(fileName); button.setFont(new Font("宋體", Font.PLAIN, 20)); button.setBackground(Color.WHITE); button.setBorderPainted(false); button.setFocusPainted(false); // 獲取面板內容 Document document = textShowPane.getDocument(); try { document.insertString(document.getLength(), input, new SimpleAttributeSet()); textShowPane.insertIcon(fileImage); textShowPane.insertComponent(button); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } //為名稱按鈕添加監聽事件,實現打開功能 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub try { // 實現打開文件功能 File file = new File(path); Desktop.getDesktop().open(file); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } }); textInputPane.setText(""); // 保存路徑到對應的賬號信息裡 String saveText = input + path + "
"; SaveRecords records = new SaveRecords(userName, saveText); records.saveRecords(); } //發送表情包功能 public void sendEmoji(String path) { // 獲取圖片 ImageIcon imageIcon = new ImageIcon(path); // 獲取日期 Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM--dd HH:mm:ss"); String input = dateFormat.format(date) + "
"; // 獲取整個展示面板的內容,方便圖片文件的插入 Document document = textShowPane.getDocument(); try { // 插入日期 document.insertString(document.getLength(), input, new SimpleAttributeSet()); // 插入圖片 textShowPane.insertIcon(imageIcon); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 輸入框重新清空 textInputPane.setText(""); } }
五、保存歷史記錄
發送文字、圖片、文件和表情包的信息(文字或路徑)都要保存到本地,以便歷史信息的回顯,查找歷史信息。
package function; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; /** * 該類實現保存信息記錄 * * * @author 360°順滑 * * @date 2020/05/01 * */ public class SaveRecords { String userName; String input; public SaveRecords(String userName,String input) { this.userName = userName; this.input = input; } public void saveRecords() { String path = "src/txt/" + userName + ".txt"; File file = new File(path); // 文件不存在就創建一個 if (!file.exists()) { try { file.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } FileWriter fileWriter = null; BufferedWriter bufferedWriter = null; try { fileWriter = new FileWriter(file,true); bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write(input); bufferedWriter.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (bufferedWriter != null) { try { bufferedWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fileWriter != null) { try { fileWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
六、歷史記錄回顯
登錄後進入主界面或者進入歷史記錄界面會看到該賬號以前發送過的信息記錄
歷史記錄回顯:
package function; import java.awt.Color; import java.awt.Desktop; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; /** * * 該類實現歷史記錄回顯 * * @author 360°順滑 * * @date 2020/05/02 * */ public class RecordsEcho { private String userName; private JTextPane showPane; public RecordsEcho(String userName, JTextPane showPane) { this.userName = userName; this.showPane = showPane; } // 將用戶的信息記錄回顯到展示面板 public void read() { // 對應賬號的信息記錄文本 File file = new File("src/txt/" + userName + ".txt"); // 文件不存在就創建一個 if (!file.exists()) { try { file.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } FileReader fileReader = null; BufferedReader bufferedReader = null; try { fileReader = new FileReader(file); bufferedReader = new BufferedReader(fileReader); // 正則表達式 Pattern pattern = Pattern.compile(".+[\.].+"); String str = null; while ((str = bufferedReader.readLine()) != null) { Matcher matcher = pattern.matcher(str); // 如果是文件或圖片 if (matcher.find()) { // 獲得文件名 int index = str.lastIndexOf("\"); String fileName = str.substring(index + 1); // 圖片的情況 if (str.endsWith(".png") || str.endsWith(".jpg") || str.endsWith(".jpeg") || str.endsWith("gif")) { Pattern pattern1 = Pattern.compile("[emoji_].+[\.].+"); Matcher matcher1 = pattern1.matcher(fileName); // 如果是表情包 if (matcher1.find()) { writeEmoji(str); } else { writeImage(str, fileName); } } else { // 文件的情況 writeFile(str, fileName); } } else { // 如果是文本則直接寫入 writeText(str); } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fileReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } // 把文本顯示在展示面板 public void writeText(String str) { String s = ""; for (int i = 0; i < str.length(); i++) { if (i != 0 && i % 30 == 0) s += "
"; s += str.charAt(i); } Document document = showPane.getDocument(); try { document.insertString(document.getLength(), s + "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void writeEmoji(String path) { // 獲取圖片 ImageIcon imageIcon = new ImageIcon(path); // 獲取整個展示面板的內容,方便圖片文件的插入 Document document = showPane.getDocument(); try { // 插入圖片 showPane.insertIcon(imageIcon); // 換行 document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 把圖片顯示在展示面板 public void writeImage(String path, String fileName) { // 獲取圖片 ImageIcon imageIcon = new ImageIcon(path); // 如果圖片比整個界面大則調整大小 int width, height; if (imageIcon.getIconWidth() > 950 || imageIcon.getIconHeight() > 400) { width = 600; height = 250; } else { width = imageIcon.getIconWidth(); height = imageIcon.getIconHeight(); } // 設置圖片大小 imageIcon.setImage(imageIcon.getImage().getScaledInstance(width, height, 0)); // 為圖片名稱添加按鈕,用於打開圖片 JButton button = new JButton(fileName); button.setFont(new Font("宋體", Font.PLAIN, 20)); button.setBackground(Color.WHITE); button.setBorderPainted(false); button.setFocusPainted(false); // 獲取整個展示面板的內容,方便圖片文件的插入 Document document = showPane.getDocument(); try { // 插入圖片 showPane.insertIcon(imageIcon); // 換行 document.insertString(document.getLength(), "
", new SimpleAttributeSet()); // 插入按鈕,也就是圖片名稱 showPane.insertComponent(button); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 為按鈕添加點擊事件 button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub try { // 實現打開文件功能 File file = new File(path); Desktop.getDesktop().open(file); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } }); } // 把文件顯示在展示面板中 public void writeFile(String path, String fileName) { // 獲取固定文件圖標 Icon fileImage = new ImageIcon("src/pictures/document.png"); // 為名稱添加按鈕 JButton button = new JButton(fileName); button.setFont(new Font("宋體", Font.PLAIN, 20)); button.setBackground(Color.WHITE); button.setBorderPainted(false); button.setFocusPainted(false); // 獲取面板內容 Document document = showPane.getDocument(); try { showPane.insertIcon(fileImage); showPane.insertComponent(button); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub try { // 實現打開文件功能 File file = new File(path); Desktop.getDesktop().open(file); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } }); } }
七、發送表情包
通過主界面表情包按鈕可以打開表情包窗口
點擊表情包,可以發送表情包
表情包界面
package frame; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; import function.SaveRecords; /** * 該類實現表情包窗體 * * @author 360°順滑 * * @date 2020/05/03 * */ public class EmojiFrame { //展示面板 private JTextPane showPane; //表情包按鈕 private JButton[] buttons = new JButton[55]; //表情包圖片 private ImageIcon[] icons = new ImageIcon[55]; //表情包對話框 private JDialog emojiJDialog; //賬號 private String userName; public EmojiFrame(JTextPane showPane,String userName) { this.showPane = showPane; this.userName = userName; } //表情包窗體 public void init() { //用對話框來裝表情包 emojiJDialog = new JDialog(); emojiJDialog.setTitle("表情包"); emojiJDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); emojiJDialog.setLayout(new GridLayout(6, 9)); emojiJDialog.setBounds(490, 263, 500, 400); emojiJDialog.setBackground(Color.WHITE); ImageIcon image = new ImageIcon("src/pictures/emoji.png"); emojiJDialog.setIconImage(image.getImage()); //表情包用按鈕來實現,主要是可以添加監聽事件,點擊後可以實現發送 for (int i = 1; i <= 54; i++) { String path = "src/pictures/emoji_" + i + ".png"; icons[i] = new ImageIcon(path); buttons[i] = new JButton(icons[i]); buttons[i].setBackground(Color.WHITE); buttons[i].setBorder(null); buttons[i].setBorderPainted(false); buttons[i].setSize(20, 20); buttons[i].setFocusPainted(false); emojiJDialog.add(buttons[i]); } emojiJDialog.setVisible(true); //添加監聽事件 addListen(); } //監聽事件 public void addListen() { //為每一個按鈕添加監聽事件 for(int i=1;i<=54;i++) { String path = "src/pictures/emoji_" + i + ".png"; buttons[i].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //獲取圖片 ImageIcon imageIcon = new ImageIcon(path); // 獲取日期 Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String input = dateFormat.format(date) + "
"; Document document = showPane.getDocument(); try { //寫入日期 document.insertString(document.getLength(), input, new SimpleAttributeSet()); //插入圖片 showPane.insertIcon(imageIcon); //換行 document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 保存路徑到對應的賬號信息裡,因為用的是絕對路徑,所以要根據實際來修改 String saveText = input + "D:\eclipse jee\FileTransfer\" + path + "
"; SaveRecords records = new SaveRecords(userName, saveText); records.saveRecords(); emojiJDialog.setVisible(false); } }); } } }
發送表情包
//該方法寫在FileSend類 //發送表情包功能 public void sendEmoji(String path) { // 獲取圖片 ImageIcon imageIcon = new ImageIcon(path); // 獲取日期 Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM--dd HH:mm:ss"); String input = dateFormat.format(date) + "
"; // 獲取整個展示面板的內容,方便圖片文件的插入 Document document = textShowPane.getDocument(); try { // 插入日期 document.insertString(document.getLength(), input, new SimpleAttributeSet()); // 插入圖片 textShowPane.insertIcon(imageIcon); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 輸入框重新清空 textInputPane.setText(""); }
八、查看歷史
記錄通過主界面的歷史記錄按鈕可以打開歷史記錄窗口
歷史記錄界面
package frame; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTextPane; import function.ClearRecords; import function.FindRecords; import function.RecordsEcho; /** * 該類實現歷史記錄窗口 * * @author 360°順滑 * * @date 2020/05/02 * */ public class HistoricRecordsFrame { private String userName; private JTextPane textShowPane; private JFrame historicRecordsFrame; private JButton findRecordsButton; private JButton clearRecordsButton; private JTextField searchTextField; private JTextPane recordsShowPane; private Box clearBox; public HistoricRecordsFrame(String userName,JTextPane textShowPane) { this.userName = userName; this.textShowPane = textShowPane; } public void init() { // 搜索文本框 searchTextField = new JTextField(); searchTextField.setFont(new Font("宋體", 0, 25)); // 查找記錄按鈕 findRecordsButton = new JButton("查找記錄"); findRecordsButton.setFont(new Font("行楷", Font.PLAIN, 20)); findRecordsButton.setBackground(Color.WHITE); findRecordsButton.setBorderPainted(false); findRecordsButton.setFocusPainted(false); // 將搜索文本框和搜索按鈕放入Box容器 Box searchBox = Box.createHorizontalBox(); searchBox.setPreferredSize(new Dimension(900, 47)); searchBox.setBackground(Color.white); searchBox.add(Box.createHorizontalStrut(35)); searchBox.add(searchTextField); searchBox.add(Box.createHorizontalStrut(20)); searchBox.add(findRecordsButton); searchBox.add(Box.createHorizontalStrut(25)); // 顯示文本窗格 recordsShowPane = new JTextPane(); recordsShowPane.setSize(900, 600); recordsShowPane.setBackground(Color.WHITE); recordsShowPane.setEditable(false); recordsShowPane.setBorder(null); recordsShowPane.setFont(new Font("宋體", 0, 25)); // 顯示文本窗格添加滾動條 JScrollPane scrollShowPane = new JScrollPane(recordsShowPane); // 清空記錄按鈕 clearRecordsButton = new JButton("清空記錄"); clearRecordsButton.setFont(new Font("行楷", Font.PLAIN, 20)); clearRecordsButton.setBackground(Color.WHITE); clearRecordsButton.setBorderPainted(false); clearRecordsButton.setFocusable(false); // Box容器並添加清空記錄按鈕 clearBox = Box.createHorizontalBox(); clearBox.setPreferredSize(new Dimension(1000, 60)); clearBox.setBackground(Color.white); clearBox.add(Box.createVerticalStrut(5)); clearBox.add(clearRecordsButton); clearBox.add(Box.createVerticalStrut(5)); // 設置主窗體 historicRecordsFrame = new JFrame("歷史記錄"); historicRecordsFrame.setSize(900, 700); historicRecordsFrame.setLocationRelativeTo(null); historicRecordsFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 改變窗體logo ImageIcon image = new ImageIcon("src/pictures/historicRecordsLogo.png"); historicRecordsFrame.setIconImage(image.getImage()); historicRecordsFrame.setLayout(new BorderLayout()); // 添加窗體以上兩個主要容器 historicRecordsFrame.add(searchBox, BorderLayout.NORTH); historicRecordsFrame.add(scrollShowPane, BorderLayout.CENTER); historicRecordsFrame.add(clearBox, BorderLayout.SOUTH); historicRecordsFrame.setVisible(true); addListen(); RecordsEcho recordsEcho = new RecordsEcho(userName, recordsShowPane); recordsEcho.read(); } //添加按鈕監聽事件 public void addListen() { //清空歷史記錄監聽事件 clearRecordsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub new ClearRecords(userName,textShowPane,recordsShowPane).clear(); } }); //查找記錄監聽事件 findRecordsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub FindRecords findRecords = new FindRecords(recordsShowPane,userName,searchTextField.getText()); findRecords.find(); } }); } }
歷史記錄回顯的代碼上面已經給了,這裡就不貼了。
還有一點功能值得一提,就是點擊歷史記錄中的圖片文件可以直接打開!
九、查找歷史記錄
輸入關鍵字點擊查找記錄按鈕可以實現歷史記錄的查找,找不到則顯示“無相關記錄!”
查找歷史記錄
package function; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; /** * 該類實現查找歷史記錄 * * 這段代碼說實話,寫得有點糟,本來後期要優化,但是有點難搞,就這樣吧,將就著看! * * * @author 360°順滑 * * @date 2020/05/02 */ public class FindRecords { private JTextPane recordsShowPane; private String userName; private String keywords; public FindRecords(JTextPane recordsShowPane, String userName, String keywords) { this.recordsShowPane = recordsShowPane; this.userName = userName; this.keywords = keywords; } // 該方法包括查找文本、圖片、文件,因為要交叉使用,所以寫在一起了 public void find() { // 如果查找的不為空 if (!(keywords.equals(""))) { // 查找相關賬號歷史記錄 File file = new File("src/txt/" + userName + ".txt"); FileReader fileReader = null; BufferedReader bufferedReader = null; try { fileReader = new FileReader(file); bufferedReader = new BufferedReader(fileReader); String str = ""; String str1 = null; // 先把所有文本找到 while ((str1 = bufferedReader.readLine()) != null) { if (str1.equals("")) str += "
"; else str = str + str1 + "
"; } // 正則表達式匹配要找的內容 Pattern pattern = Pattern.compile(".+
.*" + keywords + ".*
"); Matcher matcher = pattern.matcher(str); // 標記有沒有找到 boolean isExist = false; // 標記是否第一次找到 boolean oneFind = false; // 如果找到了 while (matcher.find()) { isExist = true; // 正則表達式匹配是否為文件圖片路徑 Pattern pattern1 = Pattern.compile(".+[\.].+"); Matcher matcher1 = pattern1.matcher(matcher.group()); // 如果是文件或者圖片 if (matcher1.find()) { // 截取日期 int index3 = matcher.group().indexOf("
"); String date = matcher.group().substring(0, index3); // 獲得文件名 int index1 = matcher.group().lastIndexOf("\"); int index2 = matcher.group().lastIndexOf("
"); String fileName = matcher.group().substring(index1 + 1, index2); // 圖片的情況 if (fileName.endsWith(".png") || fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith("gif")) { Pattern pattern2 = Pattern.compile("[emoji_].+[\.].+"); Matcher matcher2 = pattern2.matcher(fileName); // 如果是表情包則不需要添加名稱 if (matcher2.find()) { if (!oneFind) { // 寫入日期 recordsShowPane.setText(date + "
"); // 插入表情包和名稱 RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane); echo.writeEmoji(matcher1.group()); Document document = recordsShowPane.getDocument(); try { document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } oneFind = true; } else { // 不是第一次就直接寫入 Document document = recordsShowPane.getDocument(); try { document.insertString(document.getLength(), date + "
", new SimpleAttributeSet()); RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane); echo.writeEmoji(matcher1.group()); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } // 不是表情包的圖片 else { // 如果是第一次找到,要先清空再寫入 if (!oneFind) { // 寫入日期 recordsShowPane.setText(date + "
"); // 插入圖片和名稱 RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane); echo.writeImage(matcher1.group(), fileName); // 換行 Document document = recordsShowPane.getDocument(); try { document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 標記不是第一次了 oneFind = true; } else { // 不是第一次找到就直接寫入 Document document = recordsShowPane.getDocument(); try { document.insertString(document.getLength(), date + "
", new SimpleAttributeSet()); RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane); echo.writeImage(matcher1.group(), fileName); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } else { // 文件的情況 // 第一次找到 if (!oneFind) { // 清空並寫入日期 recordsShowPane.setText(date + "
"); // 插入文件圖片以及名稱 RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane); echo.writeFile(matcher1.group(), fileName); // 換行 Document document = recordsShowPane.getDocument(); try { document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } oneFind = true; } else { // 不是第一次找到 Document document = recordsShowPane.getDocument(); try { document.insertString(document.getLength(), date + "
", new SimpleAttributeSet()); RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane); echo.writeFile(matcher1.group(), fileName); document.insertString(document.getLength(), "
", new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } else { // 查找的是文本 String s = ""; for(int i = 0; i < matcher.group().length(); i++) { //因為查找到的字符串包含日期,所以要從20開始 if(i>20 && (i-20) % 30 == 0) s += "
"; s += matcher.group().charAt(i); } if (!oneFind) { recordsShowPane.setText(s); oneFind = true; } else { Document document = recordsShowPane.getDocument(); try { document.insertString(document.getLength(), s, new SimpleAttributeSet()); } catch (BadLocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } // 找不到的情況 if (!isExist) recordsShowPane.setText("
無相關記錄!"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fileReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } else { // 查找為空的情況 recordsShowPane.setText("
無相關記錄!"); } } }
十、清空歷史記
錄點擊清空歷史記錄,所有信息都會被刪除,包括本地信息。
清空歷史信息
package function; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.swing.JTextPane; /** * 該類實現清空歷史記錄的功能 * * @author 360°順滑 * * @date 2020/05/03 * */ public class ClearRecords { private JTextPane textShowPane; private JTextPane recordsShowPane; private String userName; public ClearRecords(String userName,JTextPane textShowPane,JTextPane recordsShowPane) { this.userName = userName; this.textShowPane = textShowPane; this.recordsShowPane = recordsShowPane; } //把展示面板、輸入面板、本地信息全部清空 public void clear() { textShowPane.setText(""); recordsShowPane.setText(""); String path = "src/txt/" + userName + ".txt"; File file = new File(path); FileWriter fileWriter = null; BufferedWriter bufferedWriter = null; try { fileWriter = new FileWriter(file); bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write("");; bufferedWriter.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (bufferedWriter != null) { try { bufferedWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fileWriter != null) { try { fileWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
十一、拖拽輸入文本、圖片和文件
通過拖拽將文本信息(複製粘貼)、圖片文件路徑輸入到輸入框中,發送後可以顯示圖片文件。同時,拖拽可以同時拖多個文件。
拖拽輸入文本文件
package function; import java.awt.datatransfer.DataFlavor; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.io.File; import java.util.List; import javax.swing.JTextPane; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; /** * 該類實現拖拽文件,複製粘貼功能 * * 由於該功能第一次實現,所以部分代碼是搬磚過來的 * * @author 360°順滑 * * @date 2020/05/03 */ public class DropTargetFile implements DropTargetListener { /** 用於顯示拖拽數據的面板 */ private JTextPane inputPane; public DropTargetFile(JTextPane inputPane) { this.inputPane = inputPane; } public void dragEnter(DropTargetDragEvent dtde) { } public void dragOver(DropTargetDragEvent dtde) { } public void dragExit(DropTargetEvent dte) { } public void dropActionChanged(DropTargetDragEvent dtde) { } public void drop(DropTargetDropEvent dtde) { boolean isAccept = false; try { /* * 判斷拖拽目標是否支持文件列表數據(即拖拽的是否是文件或文件夾, 支持同時拖拽多個) */ if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { // 接收拖拽目標數據 dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); isAccept = true; // 以文件集合的形式獲取數據 @SuppressWarnings("unchecked") List

files = (List) dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); // 把文件路徑輸出到文本區域 if (files != null && files.size() > 0) { StringBuilder filePaths = new StringBuilder(); for (File file : files) { filePaths.append(file.getAbsolutePath() + "
"); } Document document = inputPane.getDocument(); document.insertString(document.getLength(), filePaths.toString(), new SimpleAttributeSet()); } } } catch (Exception e) { e.printStackTrace(); } // 如果此次拖拽的數據是被接受的, 則必須設置拖拽完成(否則可能會看到拖拽目標返回原位置, 造成視覺上以為是不支持拖拽的錯誤效果) if (isAccept) { dtde.dropComplete(true); } } }
功能基本就是這樣了,還是有許多bug,但改不動了,後續有時間有機會再改進吧!!!


[wooen ] Java 文件傳輸助手的實現(單機版)已經有223次圍觀

http://coctec.com/docs/java/show-post-233818.html