设计过程:
- 整个系统需要哪些功能?
登陆,注册,搜索文件,上传文件,浏览文件目录,选择文件下载,浏览自己上传的文件并可以选择进行下载/删除/重命名 - 实现功能的面板需要几个?
6个——登陆、注册、功能面板、文件目录、文件管理、下载 - 面板之间的跳转通过哪个部件?
按钮 - 每个面板内含有哪些元素?
- 基本上是Label、Button、TextFiled
- 特殊的有PasswordField、FileChooser、ProgressBar、CheckBox、ScrollPane
- 每个元素对应的功能是什么?
- Label:说明文字
- Button:进行操作
- TextFiled:文本框,输入数据
- PasswordField:密码输入框,隐藏明文密码
- FileChooser:文件选择窗口,上传文件的选择/下载路径的选择
- ProgressBar:进度条,上传/下载/删除的完成进度
- CheckBox:多选框,选择文件目录
- ScrollPane:滚动条
- 操作后不同结果的提示是什么?
- 成功——提示成功
- 失败——提示失败及可能原因
- 进度——如删除则显示进度条
数据库设计
此篇主要是面板设计,与后端及server的互动不多,所以数据库设计并不完整
下篇会将所有C/S互动补充完整
Client
面板
登陆面板举例
- 结构
- 用户表
环境
- Windows Server 2019
- phpStudy V8.0下载页面
- 启动Apache
- 启动Mysql
- Client端:VScode
- 配置Java:Java SE 8u251
- 下载页面
- 记住安装路径便于配置环境变量
- 通过VScode自身安装Java
- 随便打开一个Java文件
- 右下角弹出Java安装进行安装即可
- 配置Java:Java SE 8u251
- Server端:Eclipse IDE
- 下载页面
- 下载后解压为文件夹放到合适的位置如:
C:\Program Files
即可 - 将文件夹内的应用程序快捷方式到桌面方便使用
文件目录架构
- client
点击查看大图
- server
-
import java.awt.Font; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPasswordField; import javax.swing.JTextField; public class admin extends JFrame{ private int count=0; private JButton bt1;//登陆按钮 private JButton bt2;//注册按钮 private JLabel jl_1;//登录的版面 private JFrame jf_1;//登陆的框架 private JTextField jtext1;//用户名 private JPasswordField jtext2;//密码 private JLabel jl_admin; private JLabel jl_password; public admin (String a,String b){//初始化登陆界面 Font font =new Font("黑体", Font.PLAIN, 15);//设置字体 jf_1=new JFrame("登陆界面"); jf_1.setSize(400, 320); //给登陆界面添加背景图片 ImageIcon bgim = new ImageIcon(admin.class.getResource("back.png")) ;//背景图案 bgim.setImage(bgim.getImage(). getScaledInstance(bgim.getIconWidth(), bgim.getIconHeight(), Image.SCALE_DEFAULT)); jl_1=new JLabel(); jl_1.setIcon(bgim); jl_admin=new JLabel("用户名"); jl_admin.setBounds(20, 50, 60, 50); jl_admin.setFont(font); jl_password=new JLabel("密 码"); jl_password.setBounds(20, 120, 60, 50); jl_password.setFont(font); bt1=new JButton("登陆"); //更改成loginButton bt1.setBounds(70, 210, 100, 50); bt1.setFont(font); bt2=new JButton("注册"); bt2.setBounds(230, 210, 100, 50); bt2.setFont(font); //加入文本框 jtext1=new JTextField(a); jtext1.setBounds(110, 50, 250, 40); jtext1.setFont(font); jtext2=new JPasswordField(b);//密码输入框 jtext2.setEchoChar('*');//设置密文显示 jtext2.setBounds(110, 120, 250, 40); jtext2.setFont(font); //元素加入面板 jl_1.add(jtext1); jl_1.add(jtext2); jl_1.add(jl_admin); jl_1.add(jl_password); jl_1.add(bt1); jl_1.add(bt2); jf_1.add(jl_1); jf_1.setVisible(true); jf_1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf_1.setLocation(300,200); //登陆点击事件 ActionListener bt1_ls=new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { String admin=jtext1.getText(); char[] password=jtext2.getPassword(); String str=String.valueOf(password); //将char数组转化为string类型 //判断用户名和密码 if(admin.equals("Uling")&&str.equals("22dd66cc")){ System.out.println(admin); System.out.println(str); new mainLayout(admin);//跳转界面 jf_1.dispose();//销毁当前界面 } else { count++; System.out.println("error"); JOptionPane.showMessageDialog(null, "登录失败"); if(count==3){//密码输入错三次直接退出 JOptionPane.showMessageDialog(null, "即将退出,再见"); jf_1.dispose(); } } } }; bt1.addActionListener(bt1_ls); bt2.addActionListener(new ActionListener(){//对注册按钮添加监听事件 @Override public void actionPerformed(ActionEvent arg0) { new register();//进入都到注册窗体中 jf_1.dispose(); } }); } public static void main(String[] args) { //初始化登陆界面 new admin("Uling","22dd66cc"); } }
其他面板详细举例见《P2P:局域网内文件传输【带界面】》
进度条的使用
-
public class Down extends JFrame{ public Down(){ JFrame jf=new JFrame(); jf.setTitle("下载界面"); jf.setLayout(null); jf.setSize(400,300); jf.setLocation(500,200); jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭选项 JPanel fun = new Fun(jf); fun.setBounds(20,10,360,200); fun.setBorder(BorderFactory.createTitledBorder("")); jf.add(fun); jf.setVisible(true); } public static void main(String[] args) { new Down(); } } class Fun extends JPanel implements ActionListener { JButton download; Timer timer; JProgressBar jpb; JFrame jf; public Fun(JFrame jf) { this.jf=jf; this.setLayout(null); setSize(360, 200);//设置宽、高 timer = new Timer(50, this); // 创建一个计时器,计时间隔为50毫秒 download=new JButton("开始下载"); download.setBounds(20,115,100,30); jpb = new JProgressBar(); jpb.setOrientation(JProgressBar.HORIZONTAL);//设置进度条的方向:平行 jpb.setMinimum(0);//最小值为0 jpb.setMaximum(100);//最大值为100 jpb.setValue(0);//赋初始值 jpb.setStringPainted(true);//true:进度条呈现进度字符串 jpb.setBounds(130,120,200,20); this.add(download); this.add(jpb); download.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == timer) {//监听到有动作发生的某个控件(定时器) int value = jpb.getValue();//返回进度条的当前值 jpb.setValue(0);//将进度条回复0值 if (value < 100) {//若当前进度未满 value++;//自加 jpb.setValue(value);//将进度条重新赋值 } else { timer.stop();//进度条已满则停止Timer,使它停止向其监听器发送动作事件 } } else if ((JButton) e.getSource() == download){//文件下载 download.setEnabled(false); if(path==null){//错误提示 JOptionPane.showMessageDialog(null, "未选择保存路径","错误",JOptionPane.ERROR_MESSAGE); download.setEnabled(true); } else{ try { timer.start(); /*下载开始。。。操作*/ } }catch (IOException q) { System.out.println("异常"); download.setEnabled(true); } } } } }
文件选择窗口
- 文件选择
-
public class Up extends JFrame{ public Up(){ JFrame jf=new JFrame(); jf.setTitle("Up"); jf.setLayout(null); jf.setSize(400,300); jf.setLocation(500,200); jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭选项 JPanel fun = new Fun(jf); fun.setBounds(20,10,360,200); fun.setBorder(BorderFactory.createTitledBorder("")); jf.add(fun); jf.setVisible(true); } public static void main(String[] args) { new Up(); } } class Fun extends JPanel implements ActionListener { JFileChooser jfc;//文件选择窗口 JTextField file_path; JButton look; JFrame jf; String path,name; public Fun(JFrame jf) { this.jf=jf; this.setLayout(null); setSize(360, 200);//设置宽、高 jfc = new JFileChooser(); file_path=new JTextField("待发送文件:"); file_path.setBounds(40,60,200,30); look= new JButton("浏览"); look.setBounds(240,60,80,30); this.add(download_path); this.add(file_path); this.add(look); look.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { int result; if ((JButton) e.getSource() == look){//浏览按钮被按下 jfc.setApproveButtonText("确定");//文件选择窗口中的 approvebutton 内使用的文本 jfc.setDialogTitle("选择文件窗口");//文件选择窗口中的标题栏 result = jfc.showOpenDialog(this); //null———显示在当前电脑显示器屏幕的中央 //this———显示在当前你编写的程序屏幕中央 //返回一个DialogResult,对应你按的按钮【如:单击“关闭”按钮会隐藏窗体,并将DialogResult属性设置为DialogResult.Cancel 】 if (result == JFileChooser.APPROVE_OPTION) // 当用户按下文件选择窗口中的确定 { path = new String(jfc.getSelectedFile().getPath());//文件路径 //getSelectedFile()返回选中的文件 //getPath()将此抽象路径名转换为一个路径名字符串 name= new String(jfc.getSelectedFile().getName());//文件名 file_path.setText("文件:" + name + "待上传!"); } } } }
参考链接
基于NIO的Socket通信(使用Java NIO的综合示例讲解)
PS:还差server与client的互动没有完成等完成了再分享