多线程+MySQL+JS开发的小项目

前言

最近学完了Java高阶课程,结合MySQL,做了一个简单的短讯小系统。写篇文章记录一下


效果图

主界面如下:

主界面

点击注册我们会进入注册界面,这里我们可以创建账号,注册

注册界面如下:

注册界面

接着我们返回先前界面,登录一下我之前注册好的账号注册的账号

用户界面如下:

用户界面

我们输入手机号110然后点击对话键后,我们就可以对话了,里面会显示已有的界面

对话界面如下:

对话界面

对话界面我们可以通过消息框发消息,如果两个账号同时登录可以通过多线程进行实时更新,就可以聊天了。

遇到的小问题

和数据库连接后无法通过Java把中文输入进去

解决方法:

在这里插入图片描述

只需要在设计表中将数据字符集改成编译器中所用的编码格式即可

代码块

以下为主登录界面的代码

public class Main extends JFrame {
	JbdcObdcConnection con=new JbdcObdcConnection();
	String s;
	private JPanel contentPane;
	private JTextField t1;
	private JPasswordField t2;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try
	    {
	        BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;
	        org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
	    }
	    catch(Exception e)
	    {
	        //TODO exception
	    }

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Main() {
		setTitle("短讯");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 420, 193);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JPanel P1 = new JPanel();
		setLocationRelativeTo(null);//设置窗口默认居中1
		contentPane.add(P1, BorderLayout.NORTH);
		P1.setLayout(new BorderLayout(0, 0));
		
		JPanel P3 = new JPanel();
		P3.setBorder(new EmptyBorder(20, 20, 10, 5));
		P1.add(P3, BorderLayout.WEST);
		P3.setLayout(new GridLayout(2, 1, 5, 5));
		
		JLabel L1 = new JLabel("手机号:");
		P3.add(L1);
		
		JLabel L2 = new JLabel("\u5BC6\u7801\uFF1A");
		P3.add(L2);
		
		JPanel P4 = new JPanel();
		P4.setBorder(new EmptyBorder(20, 5, 10, 20));
		P1.add(P4, BorderLayout.CENTER);
		P4.setLayout(new GridLayout(2, 1, 5, 5));
		
		t1 = new JTextField();
		P4.add(t1);
		t1.setColumns(10);
		
		t2 = new JPasswordField();
		P4.add(t2);
		JLabel l3 = new JLabel("");
		JPanel P2 = new JPanel();
		FlowLayout flowLayout = (FlowLayout) P2.getLayout();
		flowLayout.setVgap(0);
		flowLayout.setHgap(50);
		P2.setBorder(new EmptyBorder(0, 0, 20, 0));
		contentPane.add(P2, BorderLayout.CENTER);
		
		JButton b1 = new JButton("\u767B\u5F55");
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String a1,a2;
				a1=t1.getText().toString();
				a2=new String(t2.getPassword());
				s="SELECT * FROM kehu";
				ResultSet rs=con.executeQuery(s);
				try {
					ResultSetMetaData m =rs.getMetaData();
					while(rs.next()) {
					if(a1.equals(rs.getString(3))) {
						if(a2.equals(rs.getString(4))) {
						String a3=rs.getString(2);
						User frame = new User(a3);
						frame.setVisible(true);
						dispose();}
						else {
							l3.setText("密码错误");
						}
					}else
						l3.setText("手机号不存在");
					}
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
		});
		P2.add(b1);
		
		JButton b2 = new JButton("\u6CE8\u518C");
		b2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ZhuCe frame = new ZhuCe();
				frame.setVisible(true);
				dispose();
			}
		});
		P2.add(b2);
		contentPane.add(l3, BorderLayout.SOUTH);
	}

}

以下是注册界面代码

public class ZhuCe extends JFrame {
	JbdcObdcConnection con=new JbdcObdcConnection();
	String s;
	private JPanel contentPane;
	private JTextField t1;
	private JTextField t2;
	private JPasswordField t3;
	private JPasswordField t0;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try
	    {
	        BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;
	        org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
	    }
	    catch(Exception e)
	    {
	        //TODO exception
	    }
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ZhuCe frame = new ZhuCe();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public ZhuCe() {
		setTitle("\u7528\u6237\u6CE8\u518C");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 451, 329);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		setLocationRelativeTo(null);//设置窗口默认居中
		JLabel label = new JLabel("\u7528\u6237\u540D\uFF1A");
		label.setBounds(71, 33, 66, 15);
		contentPane.add(label);
		JLabel l0 = new JLabel("");
		t1 = new JTextField();
		t1.setBounds(147, 33, 209, 23);
		contentPane.add(t1);
		t1.setColumns(10);
		
		JLabel label_1 = new JLabel("\u624B\u673A\u53F7\uFF1A");
		label_1.setBounds(71, 81, 66, 15);
		contentPane.add(label_1);
		
		t2 = new JTextField();
		t2.setColumns(10);
		t2.setBounds(147, 78, 209, 21);
		contentPane.add(t2);
		
		JLabel label_2 = new JLabel("\u5BC6\u7801\uFF1A");
		label_2.setBounds(71, 122, 66, 15);
		contentPane.add(label_2);
		
		t3 = new JPasswordField();
		t3.setBounds(147, 119, 209, 21);
		contentPane.add(t3);
		
		JLabel label_3 = new JLabel("\u91CD\u590D\u5BC6\u7801\uFF1A");
		label_3.setBounds(71, 164, 66, 15);
		contentPane.add(label_3);
		JButton button = new JButton("\u6CE8\u518C");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				l0.setText("");
				String a[];
				a=new String[4];
				a[0]=new String(t0.getPassword());
				a[1]=t1.getText().toString();
				a[2]=t2.getText().toString();
				a[3]=new String(t3.getPassword());
				if(a[1].equals(""))
				{
					l0.setText("用户名不能为空");return;
				}
				if(a[1].length()>20)
				{
					l0.setText("用户名过长");return;
				}
				if(a[2].equals(""))
				{
					l0.setText("手机号不能为空");return;
				}
				if(a[2].length()>20)
				{
					l0.setText("手机号过长");return;
				}
				for(int i=0;i<a[2].length();i++)
					if(a[2].charAt(i)<'0'||a[2].charAt(i)>'9') {
						l0.setText("手机号只能由数字组成");
						return;
					}
				if(a[3].equals(""))
				{
					l0.setText("密码不能为空");return;
				}
				if(a[3].length()>20)
				{
					l0.setText("密码过长");return;
				}
				if(!a[0].equals(a[3]))
				{
					l0.setText("密码不一致");return;
				}
				s="SELECT * FROM kehu";
				ResultSet rs=con.executeQuery(s);
				try {
					ResultSetMetaData m =rs.getMetaData();
					int cloumns=m.getColumnCount();
					while(rs.next()) {
						for(int i=2;i<=cloumns-1;i++)
						{
							if(a[i-1].equals(rs.getString(i))) {
								if(i==2) {
									l0.setText("用户名已存在");
									return;
								}
								if(i==3) {
									l0.setText("手机号已注册");
									return;
								}
							}
						}
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
				s="INSERT INTO kehu(name,tel,secret)VALUES ('"+a[1]+"','"+a[2]+"','"+a[3]+"')";
				con.executeUpdate(s);
				l0.setText("注册成功");
			}
		});
		button.setBounds(77, 212, 93, 23);
		contentPane.add(button);
		
		t0 = new JPasswordField();
		t0.setBounds(147, 161, 209, 21);
		contentPane.add(t0);
		
		
		l0.setBounds(0, 260, 338, 15);
		contentPane.add(l0);
		
		JButton button_1 = new JButton("\u91CD\u7F6E");
		button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				t0.setText("");t1.setText("");t2.setText("");
				t3.setText("");l0.setText("");
			}
		});
		button_1.setBounds(247, 212, 93, 23);
		contentPane.add(button_1);
		
		JButton button_2 = new JButton("返回");
		button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Main frame = new Main();
				frame.setVisible(true);
				dispose();
			}
		});
		button_2.setBounds(342, 260, 93, 23);
		contentPane.add(button_2);
	}
}

以下为用户界面的代码

public class User extends JFrame {
	JbdcObdcConnection con=new JbdcObdcConnection();
	String s;
	private JPanel contentPane;
	private JTextField t1;
	private JTable table;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try
	    {
	        BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;
	        org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
	    }
	    catch(Exception e)
	    {
	        //TODO exception
	    }
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					String number="zhi";
					User frame = new User(number);
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public User(String number) {
		setTitle(number+"的界面");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 350, 442);
		contentPane = new JPanel();
		setLocationRelativeTo(null);//设置窗口默认居中
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 48, 194, 345);
		contentPane.add(scrollPane);
		
		
		
		
		JLabel l1 = new JLabel("");
		JLabel label = new JLabel("联系人");
		label.setBounds(94, 23, 54, 15);
		contentPane.add(label);
		
		JLabel label_1 = new JLabel("手机号:");
		label_1.setBounds(243, 194, 81, 15);
		contentPane.add(label_1);
		
		t1 = new JTextField();
		t1.setBounds(214, 219, 110, 21);
		contentPane.add(t1);
		t1.setColumns(10);
		
		JButton button = new JButton("对话");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String a=t1.getText();
				s="SELECT * FROM kehu";
				ResultSet rs=con.executeQuery(s);
				try {
					ResultSetMetaData m =rs.getMetaData();
					while(rs.next()) 
						if(a.equals(rs.getString(3))) {
							Message frame = new Message(number,rs.getString(2));
							frame.setVisible(true);
							dispose();
						}
					l1.setText("该手机号不存在");
					}
				 catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
		});
		button.setBounds(214, 261, 112, 66);
		contentPane.add(button);
		
		table = new JTable();
		Object[][]s1= {};
		Object[]c= {"name","tel"};
		table.setModel(new DefaultTableModel(s1,c));
		DefaultTableModel model=(DefaultTableModel)table.getModel();
		l1.setBounds(220, 378, 104, 15);
		contentPane.add(l1);
		
		JButton button_1 = new JButton("更新联系人");
		button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				s="SELECT * FROM kehu";
				con.getConnection();
				ResultSet rs=con.executeQuery(s);
				table.setModel(new DefaultTableModel(s1,c));
				DefaultTableModel model=(DefaultTableModel)table.getModel();
				Vector v= new Vector();
				v.add("姓名");v.add("电话");
				model.addRow(v);
				try {
					ResultSetMetaData m =rs.getMetaData();
					while(rs.next()) 
					if(!rs.getString(2).equals(number)){
						v=new Vector();
						v.add(rs.getString(2));
						v.add(rs.getString(3));
						model.addRow(v);
					}
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
		});
		button_1.setBounds(214, 66, 110, 66);
		contentPane.add(button_1);
		
		JButton button_2 = new JButton("切换账户");
		button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Main frame = new Main();
				frame.setVisible(true);
				dispose();
			}
		});
		scrollPane.setRowHeaderView(table);
		button_2.setBounds(10, 0, 93, 23);
		contentPane.add(button_2);
	}
}

以下为对话界面的代码

public class Message extends JFrame {
	JbdcObdcConnection con=new JbdcObdcConnection();
	String s;
	JTextArea textArea = new JTextArea();
	private JPanel contentPane;
	private JTextField textField;
	public static String send="王寒冰",receive="贾汉尼拔";
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try
	    {
	        BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;
	        org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
	    }
	    catch(Exception e)
	    {
	        //TODO exception
	    }
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Message frame = new Message(send,receive);
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Message(String send1,String receive1) {
		send=send1;receive=receive1;
		setTitle(receive);
		textArea.setText("");
		cs p=new cs();
		new Thread(p).start();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 296, 527);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		setLocationRelativeTo(null);//设置窗口默认居中
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(0, 0, 280, 335);
		contentPane.add(scrollPane);
		

		textArea.setEnabled(false);
		textArea.setFont(new Font("Monospaced", Font.PLAIN, 14));
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane.setViewportView(textArea);
		JButton btnNewButton = new JButton("返回");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				User frame = new User(send);
				frame.setVisible(true);
				dispose();
			}
		});
		btnNewButton.setBounds(150, 427, 120, 51);
		contentPane.add(btnNewButton);
		textField = new JTextField();
		JButton btnNewButton_1 = new JButton("发送");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String a=textField.getText();
				textField.setText("");
				s="INSERT INTO jilu(send,receive,message)VALUES ('"+send+"','"+receive+"','"+a+"')";
				con.executeUpdate(s);
			}
		});
		btnNewButton_1.setBounds(10, 427, 120, 51);
		contentPane.add(btnNewButton_1);
		
		textField.setFont(new Font("Monospaced", Font.PLAIN, 14));
		textField.setBounds(10, 357, 260, 51);
		contentPane.add(textField);
		textField.setColumns(10);
	}
	class cs implements Runnable{
		int time=0;
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(true) {
				test();
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}

			}
		}

		private void test() {
			int ji=0;
			// TODO Auto-generated method stub
			s="SELECT * FROM jilu";
			ResultSet rs=con.executeQuery(s);
			
			try {
				ResultSetMetaData m =rs.getMetaData();
				while(rs.next()) 
				if((rs.getString(2).equals(send)&&rs.getString(3).equals(receive))||
						(rs.getString(3).equals(send)&&rs.getString(2).equals(receive))){
					if(time<=ji) {
						time=++ji;
					textArea.append(rs.getString(2)+" 对 "+rs.getString(3)+"\n");
					textArea.append(rs.getString(4)+"\n");}else ji++;
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
		
	}
}

最后

初次写文章,如果文章有错误或建议,请在下方评论或私聊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: java mysql react 是三种不同的技术或工具。 Java 是一种广泛使用的编程语言,具有跨平台性和面向对象的特点。它是一种静态类型的编程语言,用于开发各种类型的应用程序,包括桌面应用程序、移动应用程序和服务端应用程序。Java 源码是开发人员使用 Java 编写的代码,用于创建和构建应用程序。 MySQL 是一种关系型数据库管理系统,被广泛应用于网站和应用程序的后端数据存储和管理。它是一个开源的数据库系统,具有高性能和可靠性。MySQL 源码是用 C 和 C++ 编程语言编写的,并实现了 SQL 语言的标准。 React 是一个用于构建用户界面的 JavaScript 库。它由 Facebook 开发,用于构建单页应用程序和可重用的 UI 组件。React 的源码是使用 JavaScript 编写的,它实现了虚拟 DOM 和组件化的思想,以提供高效的页面渲染和可维护的代码。 JavaMySQL 和 React 都具有广泛的应用和广泛的社区支持。开发人员可以使用 Java 编写后端代码,使用 MySQL 存储和管理数据,在前端使用 React 构建用户界面。这三种技术或工具的源码都是公开的,任何人都可以查看和学习,以满足不同的开发需求。 ### 回答2: Java是一种广泛应用于开发各类应用程序的编程语言,具有跨平台特性和面向对象的编程风格。通过Java开发者可以编写服务器端程序、移动应用、桌面应用等。 MySQL是一种流行的开源关系型数据库管理系统,它支持多线程处理和事务处理,并提供了可靠的数据存储、备份和恢复功能。通过MySQL开发者可以使用结构化查询语言(SQL)来管理和操作数据。 React是一种用于构建用户界面的JavaScript库,它采用了组件化的开发模式,使得开发者能够通过创建可复用的UI组件来构建复杂的Web应用程序。React还提供了虚拟DOM(虚拟文档对象模型)概念,可以有效地更新和渲染视图,提升应用程序的性能。 源码是指软件或程序的原始代码,是开发者编写程序的基础。JavaMySQL和React都有对应的源码供开发者参考和学习。 Java的源码包含了标准库、API和核心类库等,开发者可以通过查看Java源码来理解Java的底层实现原理,掌握编程技巧和最佳实践。 MySQL的源码是开源的,开发者可以自由访问和修改。通过阅读MySQL源码,开发者可以深入了解数据库管理系统的设计思路、底层实现和优化策略,从而提升对数据库性能和扩展性的理解和控制。 React的源码也是开源的,通过查看React源码,开发者可以学习到React的内部工作原理、虚拟DOM的实现、组件化开发模式等。同时,React的源码也是一个很好的学习案例,可以帮助开发者提升自己的代码质量和设计能力。 总之,JavaMySQL和React的源码对于开发者来说是非常宝贵的资源,通过学习和理解源码,开发者能够深入了解这些技术背后的原理和机制,并能够更好地应用和优化这些技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值