Java 文件傳輸助手的實現(單機版)
項目介紹
用 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubjDialog.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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubjDialog.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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubjDialog.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;elsereturn false;}//判斷密碼是否為空方法public boolean isEmptyPassword() {//操作密碼框文本要先將其轉換為字符串if (''.equals(new String(passwordField.getPassword())))return true;elsereturn 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {bufferedReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {fileReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (vis)return true;elsereturn 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);// 表情包按?并添加圖標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個BoxtotalBox = 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);// 改變窗體logoimage = 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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubjDialog.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() {@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubTextSend textSend = new TextSend(showPane, inputPane, userName);textSend.sendText();}});// 輸入框添加鍵盤事件inputPane.addKeyListener(new KeyListener() {// 發生擊鍵事件時被觸發@Overridepublic void keyTyped(KeyEvent e) {}// 按鍵被釋放時被觸發@Overridepublic void keyReleased(KeyEvent e) {}// 按鍵被按下時被觸發@Overridepublic 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(), 'n', new SimpleAttributeSet());} catch (BadLocationException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}// 否則發送} else if (e.getKeyCode() == KeyEvent.VK_ENTER) {TextSend textSend = new TextSend(showPane, inputPane, userName);textSend.sendText();}}});// 表情包按鈕監聽事件expressionButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubnew EmojiFrame(showPane, userName).init();}});// 文件按鈕監聽事件fileButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubFileSend fileSend = new FileSend(userName, showPane, inputPane);fileSend.send();}});// 歷史記錄按鈕監聽事件historicRecordsButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubnew 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() {@Overridepublic 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);} elseexistAccountJDialog(registerJFrame);} else {differentPasswordJDialog(registerJFrame);passwordField.setText('');passwordAgainField.setText('');}}}}});// 為返回按鈕添加監聽事件goBackButton.addActionListener(new ActionListener() {@Overridepublic 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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubjDialog.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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubjDialog.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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubjDialog.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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubjDialog.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() {@Overridepublic 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;elsereturn false;}//判斷密碼是否為空方法public boolean isEmptyPassword() {//操作密碼框文本要先將其轉換為字符串if (''.equals(new String(passwordField.getPassword())) || ''.equals(new String(passwordAgainField.getPassword())))return true;elsereturn false;}//判斷密碼和輸入密碼是否一致方法public boolean isSamePassWord() {//操作密碼框文本要先將其轉換為字符串if (new String(passwordField.getPassword()).equals(new String(passwordAgainField.getPassword())))return true;elsereturn 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}if (fileReader != null) {try {fileReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} finally {if (bufferedWriter != null) {try {bufferedWriter.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (fileWriter != null) {try {fileWriter.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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) + 'n';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(), 'n', new SimpleAttributeSet());}else {new RecordsEcho(userName, textShowPane).writeImage(matcher.group(), fileName);document.insertString(document.getLength(), 'n', new SimpleAttributeSet());}} catch (BadLocationException e) {// TODO Auto-generated catch blocke.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(), 'n', new SimpleAttributeSet());}else {new RecordsEcho(userName, textShowPane).writeFile(matcher.group(), fileName);document.insertString(document.getLength(), 'n', new SimpleAttributeSet());}} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}if (!isFile) {// 實現發送文本太長自動換行String str = '';for (int i = 0; i < textInputPane.getText().length(); i++) {if (i != 0 && i % 15 == 0)str += 'n';str += textInputPane.getText().charAt(i);}Document document = textShowPane.getDocument();try {document.insertString(document.getLength(), inputText + str + 'nn', attributeSet);} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 把信息保存到對應的用戶本地歷史記錄txt文件SaveRecords records = new SaveRecords(userName, inputText + textInputPane.getText() + 'nn');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) + 'n';// 為圖片名稱添加按鈕,用于打開圖片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(), 'n', new SimpleAttributeSet());// 插入按鈕,也就是圖片名稱textShowPane.insertComponent(button);document.insertString(document.getLength(), 'nn', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 為按鈕添加點擊事件button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtry {// 實現打開文件功能File file = new File(path);Desktop.getDesktop().open(file);} catch (IOException e2) {// TODO Auto-generated catch blocke2.printStackTrace();}}});// 輸入框重新清空textInputPane.setText('');// 保存路徑到對應的賬號信息里String saveText = input + path + 'nn';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) + 'n';// 為名稱添加按鈕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(), 'nn', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}//為名稱按鈕添加監聽事件,實現打開功能button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtry {// 實現打開文件功能File file = new File(path);Desktop.getDesktop().open(file);} catch (IOException e2) {// TODO Auto-generated catch blocke2.printStackTrace();}}});textInputPane.setText('');// 保存路徑到對應的賬號信息里String saveText = input + path + 'nn';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) + 'n';// 獲取整個展示面板的內容,方便圖片文件的插入Document document = textShowPane.getDocument();try {// 插入日期document.insertString(document.getLength(), input, new SimpleAttributeSet());// 插入圖片textShowPane.insertIcon(imageIcon);document.insertString(document.getLength(), 'nn', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.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 blocke.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 blocke.printStackTrace();} finally {if (bufferedWriter != null) {try {bufferedWriter.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (fileWriter != null) {try {fileWriter.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {bufferedReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {fileReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}// 把文本顯示在展示面板public void writeText(String str) {String s = '';for (int i = 0; i < str.length(); i++) {if (i != 0 && i % 30 == 0)s += 'n';s += str.charAt(i);}Document document = showPane.getDocument();try {document.insertString(document.getLength(), s + 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void writeEmoji(String path) {// 獲取圖片ImageIcon imageIcon = new ImageIcon(path);// 獲取整個展示面板的內容,方便圖片文件的插入Document document = showPane.getDocument();try {// 插入圖片showPane.insertIcon(imageIcon);// 換行document.insertString(document.getLength(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.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(), 'n', new SimpleAttributeSet());// 插入按鈕,也就是圖片名稱showPane.insertComponent(button);document.insertString(document.getLength(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 為按鈕添加點擊事件button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtry {// 實現打開文件功能File file = new File(path);Desktop.getDesktop().open(file);} catch (IOException e2) {// TODO Auto-generated catch blocke2.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(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtry {// 實現打開文件功能File file = new File(path);Desktop.getDesktop().open(file);} catch (IOException e2) {// TODO Auto-generated catch blocke2.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() {@Overridepublic 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) + 'n';Document document = showPane.getDocument();try {//寫入日期document.insertString(document.getLength(), input, new SimpleAttributeSet());//插入圖片showPane.insertIcon(imageIcon);//換行document.insertString(document.getLength(), 'nn', new SimpleAttributeSet());} catch (BadLocationException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}// 保存路徑到對應的賬號信息里,因為用的是絕對路徑,所以要根據實際來修改String saveText = input + 'D:eclipse jeeFileTransfer' + path + 'nn';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) + 'n';// 獲取整個展示面板的內容,方便圖片文件的插入Document document = textShowPane.getDocument();try {// 插入日期document.insertString(document.getLength(), input, new SimpleAttributeSet());// 插入圖片textShowPane.insertIcon(imageIcon);document.insertString(document.getLength(), 'nn', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.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);// 改變窗體logoImageIcon 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() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubnew ClearRecords(userName,textShowPane,recordsShowPane).clear();}});//查找記錄監聽事件findRecordsButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubFindRecords 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 += 'n';elsestr = str + str1 + 'n';}// 正則表達式匹配要找的內容Pattern pattern = Pattern.compile('.+n.*' + keywords + '.*nn');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('n');String date = matcher.group().substring(0, index3);// 獲得文件名int index1 = matcher.group().lastIndexOf('');int index2 = matcher.group().lastIndexOf('nn');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 + 'n');// 插入表情包和名稱RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane);echo.writeEmoji(matcher1.group());Document document = recordsShowPane.getDocument();try {document.insertString(document.getLength(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}oneFind = true;} else { // 不是第一次就直接寫入Document document = recordsShowPane.getDocument();try {document.insertString(document.getLength(), date + 'n',new SimpleAttributeSet());RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane);echo.writeEmoji(matcher1.group());document.insertString(document.getLength(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}// 不是表情包的圖片else {// 如果是第一次找到,要先清空再寫入if (!oneFind) {// 寫入日期recordsShowPane.setText(date + 'n');// 插入圖片和名稱RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane);echo.writeImage(matcher1.group(), fileName);// 換行Document document = recordsShowPane.getDocument();try {document.insertString(document.getLength(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 標記不是第一次了oneFind = true;} else { // 不是第一次找到就直接寫入Document document = recordsShowPane.getDocument();try {document.insertString(document.getLength(), date + 'n',new SimpleAttributeSet());RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane);echo.writeImage(matcher1.group(), fileName);document.insertString(document.getLength(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} else { // 文件的情況// 第一次找到if (!oneFind) {// 清空并寫入日期recordsShowPane.setText(date + 'n');// 插入文件圖片以及名稱RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane);echo.writeFile(matcher1.group(), fileName);// 換行Document document = recordsShowPane.getDocument();try {document.insertString(document.getLength(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}oneFind = true;} else { // 不是第一次找到Document document = recordsShowPane.getDocument();try {document.insertString(document.getLength(), date + 'n', new SimpleAttributeSet());RecordsEcho echo = new RecordsEcho(fileName, recordsShowPane);echo.writeFile(matcher1.group(), fileName);document.insertString(document.getLength(), 'n', new SimpleAttributeSet());} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} else { // 查找的是文本String s = '';for(int i = 0; i < matcher.group().length(); i++) {//因為查找到的字符串包含日期,所以要從20開始if(i>20 && (i-20) % 30 == 0)s += 'n';s
相關文章: