精华内容
参与话题
问答
  • Java 图形界面开发--图文并茂建立学生管理系统

    万次阅读 多人点赞 2016-03-19 19:52:28
    图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作。 关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~ ...

      (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/50932501 冷血之心的博客)

    图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作。

    关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~

           这是本人在学习java图形界面开发阶段一步一步实现的超级简易的学生管理系统。虽然说不入大神法眼,但这确实是费了自己不少心血。对于我这样的菜鸟来说,考虑不周到,一不小心就Exception,然后就是自己调呀调。在此分享出来希望对和我一样的菜鸟有帮助。

           该程序使用的数据库为SQL server,如果不太懂怎么使用java操作SQL server数据库的可以看看我的这篇博客,希望可以帮到大家。

    Java程序操作数据库SQLserver详解  

     

    Java程序完整代码下载地址见:

    http://download.csdn.net/detail/qq_25827845/9766699

     

    步骤一:静态登录界面的实现。

    代码如下:

     

    /**
     * 功能:学生成绩管理系统
     * 步骤1、登录界面的静态实现
     * author:ywq
     */
    import java.awt.*;
    import javax.swing.*;
    public class Login extends JFrame{
    	//定义组件
    	JPanel jp1,jp2,jp3;//面板
    	JLabel jlb1,jlb2;//标签
    	JButton jb1,jb2;//按钮
    	JTextField jtf;//文本
    	JPasswordField jpf;//密码
    	public static void main(String[] args) {
    		Login win=new Login();
    	}
    	
    	//构造函数
    	public Login(){
    		//创建面板
    		jp1=new JPanel();
    		jp2=new JPanel();
    		jp3=new JPanel();
    		//创建标签
    		jlb1=new JLabel("用户名");
    		jlb2=new JLabel("密    码");
    		//创建按钮
    		jb1=new JButton("登录");
    		jb2=new JButton("重置");
    		//创建文本框
    		jtf=new JTextField(10);
    		//创建密码框
    		jpf=new JPasswordField(10);
    		
    		//设置布局管理
    		this.setLayout(new GridLayout(3, 1));//网格式布局
    		
    		//加入各个组件
    		jp1.add(jlb1);
    		jp1.add(jtf);
    		
    		jp2.add(jlb2);
    		jp2.add(jpf);
    		
    		jp3.add(jb1);
    		jp3.add(jb2);
    		
    		//加入到JFrame
    		this.add(jp1);
    		this.add(jp2);
    		this.add(jp3);
    		
    		//设置窗体
    		this.setTitle("用户登录");//窗体标签
    		this.setSize(300, 150);//窗体大小
    		this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出关闭JFrame
    		this.setVisible(true);//显示窗体
    		
    		//锁定窗体
    		this.setResizable(false);
    	}
    }
    


    运行界面如图所示:

     

    本静态界面的实现,使用了网格布局,3行1列,在每一行中放入了一个JPanel面板,每个面板上又分别放入所需的组件,整体构成了一个静态的登录界面。

     

    步骤二:添加监听,并且进行验证用户名和密码。

     

    代码如下:

    /*
     * 功能:学生成绩管理系统
     * 步骤1:登录界面的静态实现
     * 步骤2:添加对各个组件的监听。
     * 步骤3:对用户名和密码进行验证。
     * author:ywq
     */
    package com.package_1;
    import javax.swing.*;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class Login extends JFrame implements ActionListener {
    
    	//定义组件
    	JButton jb1,jb2=null;
    	JRadioButton jrb1,jrb2=null;
    	JPanel jp1,jp2,jp3,jp4=null;
    	JTextField jtf=null;
    	JLabel jlb1,jlb2,jlb3=null;
    	JPasswordField jpf=null;
    	ButtonGroup bg=null;
    		
    	//设定用户名和密码
    	final String stu_name="6";
    	final String stu_pwd="1";
    	final String tea_name="5";
    	final String tea_pwd="1";
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Login  ms=new Login();
    	}
    	public Login()
    	{
    		 //创建组件
    		jb1=new JButton("登录");
    		jb2=new JButton("重置");
    		//设置监听
    		jb1.addActionListener(this);
    		jb2.addActionListener(this);
    		
    		jrb1=new JRadioButton("教师");
    		jrb2=new JRadioButton("学生");
    		bg=new ButtonGroup();
    		bg.add(jrb1);
    		bg.add(jrb2);
    		jrb2.setSelected(true);
    		
    		jp1=new JPanel();
    		jp2=new JPanel();
    		jp3=new JPanel();
    		jp4=new JPanel();				
    		
    		jlb1=new JLabel("用户名:");
    		jlb2=new JLabel("密    码:");
    		jlb3=new JLabel("权    限:");
    		
    		jtf=new JTextField(10);
    		jpf=new JPasswordField(10);
    		//加入到JPanel中
    		jp1.add(jlb1);
    		jp1.add(jtf);
    		
    		jp2.add(jlb2);
    		jp2.add(jpf);
    		
    		jp3.add(jlb3);
    		jp3.add(jrb1);
    		jp3.add(jrb2);
    		
    		jp4.add(jb1);
    		jp4.add(jb2);
    		
    		//加入JFrame中
    		this.add(jp1);
    		this.add(jp2);
    		this.add(jp3);
    		this.add(jp4);
    		//设置布局管理器
    		this.setLayout(new GridLayout(4,1));
    		//给窗口设置标题
    		this.setTitle("学生成绩管理系统");
    		//设置窗体大小
    		this.setSize(300,200);
    		//设置窗体初始位置
    		this.setLocation(200, 150);
    		//设置当关闭窗口时,保证JVM也退出
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//显示窗体
    		this.setVisible(true);
    		this.setResizable(true);
    		
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		
    		if(e.getActionCommand()=="登录")
    		{
    			//如果选中教师登录
    			if(jrb1.isSelected())
    			{
                      tealogin();
    			}else if(jrb2.isSelected()) //学生在登录系统
    			{
                      stulogin();
    			}
    			
    		}else if(e.getActionCommand()=="重置")
    		{
                      clear();
    		}			
    		
    	}
    	
    	 //学生登录判断方法
    	public void stulogin()
    	{
    		if(stu_name.equals(jtf.getText())&&stu_pwd.equals(jpf.getText()))
    		{
    //			System.out.println("登录成功");
    			JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    			clear();
    		}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
    		{
    			JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    		}else if(jtf.getText().isEmpty())
    		{
    			JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
    		}else if(jpf.getText().isEmpty())
    		{
    			JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    		}else
    		{
    			JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
    		    //清空输入框
    			clear();
    		}
    	}
    	//教师登录判断方法
    	public void tealogin()
    	{
    		if(tea_name.equals(jtf.getText())&&tea_pwd.equals(jpf.getText()))
    		{
    //			System.out.println("登录成功");
    			 JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    			 clear();
    		}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
    		{
    			JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    		}else if(jtf.getText().isEmpty())
    		{
    			JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
    		}else if(jpf.getText().isEmpty())
    		{
    			JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    		}else
    		{
    			JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
    		    //清空输入框
    			clear();
    		}
    	}
    	//清空文本框和密码框
    	public	void clear()
    	{
    		jtf.setText("");
    		jpf.setText("");
    	}
    		
    }

     

     

    运行界面如下所示:

    本程序加入了对各个组件的监听,首先implements  ActionListener接口,然后注册监听。在ActionPerformance方法中进行相应的处理事件。

    当点击登录按钮时,首先判断是哪个权限的用户在进行登录,分别调用taelogin()和stulogin()方法来进行验证。在验证方法中,对文本框和密码框的内容进行一个判断,分别弹出不同的提示信息。

     

     

    步骤三:

    (1)程序连接数据库来进行用户名和密码的验证!!!

    (2)验证成功后进行界面的切换!!!

    代码如下:

    /*
     * 功能:学生成绩管理系统
     * 步骤1、登录界面的静态实现
     * 步骤2:实现界面的切换
     * 步骤3:使用数据库来验证用户名和密码
     * author:ywq
     */
    package com.package_2;
    import javax.swing.*;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.*;
    
    public class login extends JFrame implements ActionListener {
    
    	//定义登录界面的组件
    	JButton jb1,jb2,jb3=null;
    	JRadioButton jrb1,jrb2=null;
    	JPanel jp1,jp2,jp3,jp4=null;
    	JTextField jtf=null;
    	JLabel jlb1,jlb2,jlb3=null;
    	JPasswordField jpf=null;
    	ButtonGroup bg=null;
    		
    	//设定用户名和密码
    	static String userword;
    	static String pwd;
    	
    	static Connection ct=null;
    	PreparedStatement ps=null;
    	ResultSet rs=null;
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		login  ms=new login();
    		
    		
    		try {
    			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    			ct=DriverManager.getConnection("jdbc:odbc:ywq");
    		} catch (Exception e) {
    			
    			e.printStackTrace();
    		}
    						
    	}
    	//构造函数
    	public login()
    	{
    		 //创建组件
    		jb1=new JButton("登录");
    		jb2=new JButton("重置");
    		jb3=new JButton("退出");
    		//设置监听
    		jb1.addActionListener(this);
    		jb2.addActionListener(this);
    		jb3.addActionListener(this);
    		//以上三个按钮的监听统一放在了actionPerformance()中
    		//监听也可以是下边这种方式
    //		jb3.addActionListener(new ActionListener()
    //		{
    //
    //			@Override
    //			public void actionPerformed(ActionEvent e) {
    //				// TODO Auto-generated method stub				
    //				System.exit(0);
    //			}
    //			
    //		});
    		
    		jrb1=new JRadioButton("教师");
    		jrb2=new JRadioButton("学生");
    		bg=new ButtonGroup();
    		bg.add(jrb1);
    		bg.add(jrb2);
    		jrb2.setSelected(true);
    		
    		jp1=new JPanel();
    		jp2=new JPanel();
    		jp3=new JPanel();
    		jp4=new JPanel();				
    		
    		jlb1=new JLabel("用户名:");
    		jlb2=new JLabel("密    码:");
    		jlb3=new JLabel("权    限:");
    		
    		jtf=new JTextField(10);
    		jpf=new JPasswordField(10);
    		//加入到JPanel中
    		jp1.add(jlb1);
    		jp1.add(jtf);
    		
    		jp2.add(jlb2);
    		jp2.add(jpf);
    		
    		jp3.add(jlb3);
    		jp3.add(jrb1);
    		jp3.add(jrb2);
    		
    		jp4.add(jb1);
    		jp4.add(jb2);
    		jp4.add(jb3);
    		
    		//加入JFrame中
    		this.add(jp1);
    		this.add(jp2);
    		this.add(jp3);
    		this.add(jp4);
    		//设置布局管理器
    		this.setLayout(new GridLayout(4,1));
    		//给窗口设置标题
    		this.setTitle("学生成绩管理系统");
    		//设置窗体大小
    		this.setSize(300,200);
    		//设置窗体初始位置
    		this.setLocation(200, 150);
    		//设置当关闭窗口时,保证JVM也退出
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//显示窗体
    		this.setVisible(true);
    		this.setResizable(true);
    		
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    
    		if(e.getActionCommand()=="退出")
    		{
    			System.exit(0);
    		}else if(e.getActionCommand()=="登录")
    		{
    			//如果选中教师登录
    			if(jrb1.isSelected())
    			{
    				//创建火箭车
    				try {
    					ps=ct.prepareStatement("select * from info where 权限=? ");
    					//给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式
    					ps.setString(1, "教师");					
    					//ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集
    					rs=ps.executeQuery();
    					//循环取出
    					while(rs.next()){
    						//将教师的用户名和密码取出
    						 userword=rs.getString(2);
    						 pwd=rs.getString(3);
    						System.out.println("成功获取到密码和用户名from数据库");
    						System.out.println(userword+"\t"+pwd+"\t");	
    					}
    				} catch (SQLException e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();
    				}
    				//从数据库得到用户名和密码后调用登录方法,与输入的用户名和密码作比较
    				tealogin();
    			}else if(jrb2.isSelected()) //学生在登录系统
    			{
    				//创建火箭车
    				try {
    					ps=ct.prepareStatement("select * from info where 权限=? ");
    					//给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式
    					ps.setString(1, "学生");
    					//ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集
    					rs=ps.executeQuery();
    					//循环取出
    					while(rs.next()){
    						//将学生的用户名和密码取出
    						 userword=rs.getString(2);
    						 pwd=rs.getString(3);
    						System.out.println("成功获取到密码和用户名from数据库");
    						System.out.println(userword+"\t"+pwd+"\t");	
    					}
    				} catch (SQLException e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();
    				}
    				//从数据库得到用户名和密码后调用登录方法,与输入的用户名和密码作比较
    			    stulogin();
    			}
    			
    		}else if(e.getActionCommand()=="重置")
    		{
    			clear();
    		}			
    		
    	}
    		
    	
    //清空文本框和密码框
    	public	void clear()
    		{
    			jtf.setText("");
    			jpf.setText("");
    		}
    //学生登录判断方法
    	public void stulogin()
    		{
    			if(userword.equals(jtf.getText())&&pwd.equals(jpf.getText()))
    			{
    //				System.out.println("登录成功");
    				JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    				clear();
    				//关闭当前界面
    				 dispose();
    				 //创建一个新界面
    				 UI ui=new UI();
    			}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
    			 {
    				JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    			 }else if(jtf.getText().isEmpty())
    			{
    				JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
    			}else if(jpf.getText().isEmpty())
    			{
    				JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    			}else
    			{
    				JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
    				 //清空输入框
    				clear();
    				}
    			}
    			
    	//教师登录判断方法
    	public void tealogin()
    		{
    			if(userword.equals(jtf.getText())&&pwd.equals(jpf.getText()))
    			{
    //				System.out.println("登录成功");
    				 JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    				 clear();	
    				//关闭当前界面
    				 dispose();
    				 //创建一个新界面,适用于教师来管理学生
    				 UI ui=new UI();					 					
    			}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
    			{
    				JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    			}else if(jtf.getText().isEmpty())
    			{
    				JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
    			}else if(jpf.getText().isEmpty())
    			{
    				JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    			}else
    			{
    				JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
    			    //清空输入框
    				clear();
    			}
    		}
    
    
    		
    }

    首先建立相应的数据库,如图所示:

    (注意:下边就是该数据库中表的建表语句!!!!)

    在程序中,首先是在主函数中(1)加载数据库驱动 。(2)建立连接

    此处有问题,可参考博客 http://blog.csdn.net/qq_25827845/article/details/50836362

    在进行验证时,通过建立“火箭车”将所需的SQL语句发送到数据库,并且查询得到相应的数据。利用此数据和用户输入的用户名和密码进行验证。当验证成功时,即进行界面的跳转。

     

    页面跳转关键部分:

    (1)调用dispose()方法关闭当前界面

    (2)重新new一个新界面,比如本例中的new UI();其中,UI是另一个完整的界面。

    如此实现了界面的切换。

     

    UI界面的代码如下:

    package com.package_2;
    
    import java.awt.*;
    import java.awt.event.*;
    
    import javax.swing.*;
    
    public class UI extends JFrame implements ActionListener
    {
    
    	     //定义组件
    		JButton jb1,jb2=null;
    		JPanel jp1,jp2,jp3=null;
    		JLabel jlb1,jlb2,jlb3,jlb4=null;
    		
    		public static void main(String[] args) {
    			// TODO Auto-generated method stub
    //			UI  ui=new UI();
    		}
    		
    	    //构造函数
    		public  UI()    //不能申明为void!!!!!否则弹不出新界面
    		{
    			//创建组件
    			jb1=new JButton("课程管理");
    			jb2=new JButton("成绩查询");
    			
    			jp1=new JPanel();
    			jp2=new JPanel();
    			jp3=new JPanel();
    			
    			jlb1=new JLabel("姓名");
    			jlb2=new JLabel("学号");
    			jlb3=new JLabel("最新公告:");
    			jlb4=new JLabel("我校举行六十周年校庆的通知");
    			
    			jp1.add(jlb1);
    			jp1.add(jlb2);
    			
    			jp2.add(jb1);
    			jp2.add(jlb3);
    			
    			jp3.add(jb2);
    			jp3.add(jlb4);
    			
    			
    			this.add(jp1);
    			this.add(jp2);
    			this.add(jp3);
    			
    			//设置布局管理器
    			this.setLayout(new GridLayout(3,3,50,50));
    			this.setTitle("学生成绩管理系统");
    			this.setSize(400,300);
    			this.setLocation(200, 200);		
    			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			this.setVisible(true);
    
    }
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			// TODO Auto-generated method stub
    			
    		}
    }
    


    以上程序的执行结果如图所示:

     

     

     

     

     

    步骤4:

    (1)程序连接数据库来进行用户名和密码的验证!!!

    (2)验证成功后进行界面的切换!!!【对步骤三的代码进行一定的优化】

    代码如下:Login.java

     

    /*
     * 功能:学生成绩管理系统
     * 步骤1、登录界面的静态实现
     * 步骤2:实现界面的切换
     * 步骤3:使用数据库来验证用户名和密码
     * 步骤4:对代码进行优化。增加专门用来与数据库进行连接的类
     * author:ywq
     */
    package com.package_5;
    import javax.swing.*;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.*;
    
    public class Login extends JFrame implements ActionListener {
    
    	//定义登录界面的组件
    	JButton jb1,jb2,jb3=null;
    	JRadioButton jrb1,jrb2=null;
    	JPanel jp1,jp2,jp3,jp4=null;
    	JTextField jtf=null;
    	JLabel jlb1,jlb2,jlb3=null;
    	JPasswordField jpf=null;
    	ButtonGroup bg=null;	
    	
    	//菜单项
    	JMenuBar jmb=null;	
    	JMenu jm=null;
    	JMenuItem jmi1,jmi2=null;
    	
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Login  ms=new Login();
    		
    						
    	}
    	//构造函数
    	public Login()
    	{
    		 //创建组件
    		jb1=new JButton("登录");
    		jb2=new JButton("重置");
    		jb3=new JButton("退出");
    		//设置监听
    		jb1.addActionListener(this);
    		jb2.addActionListener(this);
    		jb3.addActionListener(this);
    		
    		jmb=new JMenuBar(); //JMenuBar指菜单栏
    		jm=new JMenu("选项"); //JMenu是菜单栏中的选项栏
    		jmi1=new JMenuItem("开始"); //JMenuItem指选项栏中的选项
    		jmi2=new JMenuItem("退出系统");
    		jm.add(jmi1);
    		jm.add(jmi2);
    		jmb.add(jm);
    		
    		
    		jrb1=new JRadioButton("教师",true);
    		jrb2=new JRadioButton("学生");
    		bg=new ButtonGroup();
    		bg.add(jrb1);
    		bg.add(jrb2);
    //		jrb2.setSelected(true);
    		
    		jp1=new JPanel();
    		jp2=new JPanel();
    		jp3=new JPanel();
    		jp4=new JPanel();				
    		
    		jlb1=new JLabel("用户名:");
    		jlb2=new JLabel("密    码:");
    		jlb3=new JLabel("权    限:");
    		
    		jtf=new JTextField(10);
    		jpf=new JPasswordField(10);
    		//加入到JPanel中
    		jp1.add(jlb1);
    		jp1.add(jtf);
    		
    		jp2.add(jlb2);
    		jp2.add(jpf);
    		
    		jp3.add(jlb3);
    		jp3.add(jrb1);
    		jp3.add(jrb2);
    		
    		jp4.add(jb1);
    		jp4.add(jb2);
    		jp4.add(jb3);
    		
    		//加入JFrame中
    		this.setJMenuBar(jmb);
    		this.add(jp1);
    		this.add(jp2);
    		this.add(jp3);
    		this.add(jp4);
    		//设置布局管理器
    		this.setLayout(new GridLayout(4,1));
    		//给窗口设置标题
    		this.setTitle("学生成绩管理系统");
    		//设置窗体大小
    		this.setSize(300,250);
    		//设置窗体初始位置
    		this.setLocation(200, 150);
    		//设置当关闭窗口时,保证JVM也退出
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//显示窗体
    		this.setVisible(true);
    		this.setResizable(true);
    		
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    
    		if(e.getActionCommand()=="退出")
    		{
    			System.exit(0);
    		}else if(e.getActionCommand()=="登录")
    		{
    			//当点击登录按钮时,首先与数据库建立连接
    			GetSQL.ConnectSQL();
    			//如果选中教师登录
    			if(jrb1.isSelected())
    			{
    				GetSQL.sqlquery("教师");
    				//从数据库得到用户名和密码后调用登录方法,与输入的用户名和密码作比较
    				this.tealogin();
    			}else if(jrb2.isSelected()) //学生在登录系统
    			{
    				GetSQL.sqlquery("学生");
    				//从数据库得到用户名和密码后调用登录方法,与输入的用户名和密码作比较
    			    this.stulogin();
    			}
    			
    		}else if(e.getActionCommand()=="重置")
    		{
    			this.clear();
    		}			
    		
    	}
    				
    		//清空文本框和密码框
    	public	void clear()
    		{
    			jtf.setText("");
    			jpf.setText("");
    		}
    		    //学生登录判断方法
    			public void stulogin()
    			{
    				if(GetSQL.userword.equals(jtf.getText())&&GetSQL.pwd.equals(jpf.getText()))
    				{
    //					System.out.println("登录成功");
    					JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    					this.clear();
    					//关闭当前界面
    					 dispose();
    					 //创建一个新界面
    					 Stu_UI ui=new Stu_UI();
    				}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else if(jtf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else if(jpf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else
    				{
    					JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
    				    //清空输入框
    					this.clear();
    				}
    			}
    			
    			//教师登录判断方法
    			public void tealogin()
    			{
    				if(GetSQL.userword.equals(jtf.getText())&&GetSQL.pwd.equals(jpf.getText()))
    				{
    //					System.out.println("登录成功");
    					 JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    					 this.clear();	
    					//关闭当前界面
    					 dispose();
    					 //创建一个新界面,适用于教师来管理学生
    					Teacher t=new Teacher();				 					
    				}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else if(jtf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else if(jpf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else
    				{
    					JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
    				    //清空输入框
    					this.clear();
    				}
    			}
    		
    }
    
    

     

    SQL.java 负责与数据库建立连接,包括俩方法。一个是连接数据库方法,一个是查询方法。可进一步扩展。

    package com.package_5;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    //写一个类,用来与数据库建立连接,并且查询数据
    class GetSQL
    {
    	//设定用户名和密码
    		static String userword;
    		static String pwd;
    		
    		static Connection ct=null;
    		static PreparedStatement ps=null;
    		static ResultSet rs=null;
    	
    	//用于连接数据库的方法,可用于子类的继承
    	public static void ConnectSQL()
    	{
    		try {
    			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    			ct=DriverManager.getConnection("jdbc:odbc:ywq");
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    	//用于向数据库进行查询的方法
    	public static void sqlquery(String s)
    	{
    		//创建火箭车
    		try {			
    			ps=ct.prepareStatement("select * from info where 权限=? ");
    			//给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式
    			ps.setString(1, s);					
    			//ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集
    			rs=ps.executeQuery();
    			//循环取出
    			while(rs.next()){
    				//将教师的用户名和密码取出
    				 userword=rs.getString(2);
    				 pwd=rs.getString(3);
    				System.out.println("成功获取到密码和用户名from数据库");
    				System.out.println(userword+"\t"+pwd+"\t");	
    			}
    		} catch (Exception e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    	}
    }

    Stu_UI.java  学生登录成功后跳转的界面

     

    package com.package_5;
    
    import java.awt.*;
    import java.awt.event.*;
    
    import javax.swing.*;
    
    public class Stu_UI extends JFrame implements ActionListener
    {
    
    	     //定义组件
    		JButton jb1,jb2=null;
    		JPanel jp1,jp2,jp3=null;
    		JLabel jlb1,jlb2,jlb3,jlb4=null;
    		
    //		public static void main(String[] args) {
    //			// TODO Auto-generated method stub
    //			Stu_UI  ui=new Stu_UI();
    //		}	
    	    //构造函数
    		public  Stu_UI()    //不能申明为void!!!!!否则弹不出新界面
    		{
    			//创建组件
    			jb1=new JButton("课程管理");
    			jb2=new JButton("成绩查询");
    			
    			jp1=new JPanel();
    			jp2=new JPanel();
    			jp3=new JPanel();
    			
    			jlb1=new JLabel("姓名");
    			jlb2=new JLabel("学号");
    			jlb3=new JLabel("最新公告:");
    			jlb4=new JLabel("我校举行六十周年校庆的通知");
    			
    			jp1.add(jlb1);
    			jp1.add(jlb2);
    			
    			jp2.add(jb1);
    			jp2.add(jlb3);
    			
    			jp3.add(jb2);
    			jp3.add(jlb4);
    			
    			
    			this.add(jp1);
    			this.add(jp2);
    			this.add(jp3);
    			
    			//设置布局管理器
    			this.setLayout(new GridLayout(3,3,50,50));
    			this.setTitle("学生成绩管理系统");
    			this.setSize(400,300);
    			this.setLocation(200, 200);		
    			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			this.setVisible(true);
    
    }
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			// TODO Auto-generated method stub
    			
    		}
    }
    


    Teacher.java 教师登录成功后跳转的界面。

    package com.package_5;
    
    import javax.swing.*;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class Teacher extends JFrame implements ActionListener{
         
    	//定义组件
    	JLabel jl2=null;
    	JTextField jtf=null;
    	JButton jb=null;
    	JPanel jp1,jp2=null;
    	JTable jtable=null;
    	
    	String name=null;
    	String num=null;
    
    	static Connection ct=null;
    	PreparedStatement ps=null;
    	ResultSet rs=null;
    	
    //	public static void main(String[] args) {
    //		// TODO Auto-generated method stub
    //		Teacher t=new Teacher();
    //		
    //		try {
    //			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    //			ct=DriverManager.getConnection("jdbc:odbc:ywq");
    //		} catch (Exception e) {
    //			
    //			e.printStackTrace();
    //		}
    //		
    //	}	
    	
    	
    	//构造函数
    	public Teacher()
    	{
    		//创建组件
    		jl2=new JLabel("请输入学号:");
    		jtf=new JTextField(10);
    		jb=new JButton("查询");
    		//设置监听
    		jb.addActionListener(this);
    		//设置表格
    		final Object[] columnNames = {"姓名","学号"};
    		Object[][] rowData = {
    				{"小明","2015110512"},
    				{"小","2015110"},
    				{"小红","2015110511"}
    		};
    		jtable=new JTable(rowData, columnNames);		
    		
    		jp1=new JPanel();
    		jp2=new JPanel();
    
    		jp1.add(jl2);
    		jp1.add(jtf);
    		jp1.add(jb);
    		jp2.add(jtable);
    		
    		this.add(jp1);
    		this.add(jp2);
    		
    		this.setLayout(new GridLayout(2,3));
    		this.setTitle("学生成绩管理系统—教师");
    		this.setSize(500,400);
    		this.setLocation(200, 200);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    		
    		
    	}
    
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		
    		if(e.getActionCommand()=="查询")
    		{
    			//JOptionPane.showMessageDialog(null,"查询成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    			//创建火箭车
    			try {
    				ps=ct.prepareStatement("select * from info where xuehao=? ");
    				//给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式
    				ps.setString(1, jtf.getText());					
    				//ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集
    				rs=ps.executeQuery();
    				//循环取出
    				if(rs.next())
    				{
    					 name=rs.getString(5);
    					System.out.println("查询成功from数据库");
    					System.out.println(name+"\t");	
    					JOptionPane.showMessageDialog(null,"查询成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else
    				{
    					System.out.println("查询失败");
    					JOptionPane.showMessageDialog(null,"查询失败!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}
    //				while(rs.next()){
    //					//将教师的用户名和密码取出
    					 num=rs.getString(4);
    //					 name=rs.getString(5);
    //					System.out.println("查询成功from数据库");
    //					System.out.println(name+"\t");	
    //				}
    			} catch (SQLException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    		
    			
    		}
    		
    	}	
    }
    
    

     

    步骤5:

    优化数据库验证条件,使用不同的表来进行查询。

    教师界面增加查询功能。

     

    代码如下:Login6.java

    /*
     * 功能:学生成绩管理系统
     * 步骤1、登录界面的静态实现
     * 步骤2:实现界面的切换
     * 步骤3:使用数据库来验证用户名和密码
     * 步骤4:对代码进行优化。增加专门用来与数据库进行连接的类
     * 步骤5:优化代码,增加判断条件。
     * 步骤6:使用数据库进行查询时,优化查询方法和判断条件。数据库的表中可有多个数据。引入不同的表来查询。
     * 步骤7:教师界面实现了查询某个学生信息和某教师信息的功能。
     * author:ywq
     */
    package com.package_7;
    import javax.swing.*;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.*;
    
    public class Login6 extends JFrame implements ActionListener {
    
    	//定义登录界面的组件
    	JButton jb1,jb2,jb3=null;
    	JRadioButton jrb1,jrb2=null;
    	JPanel jp1,jp2,jp3,jp4=null;
        JTextField jtf=null;
    	JLabel jlb1,jlb2,jlb3=null;
    	JPasswordField jpf=null;
    	ButtonGroup bg=null;	
    	
    	//菜单项
    	JMenuBar jmb=null;	
    	JMenu jm=null;
    	JMenuItem jmi1,jmi2=null;
    	
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Login6  ms=new Login6();
    		
    						
    	}
    	//构造函数
    	public Login6()
    	{
    		 //创建组件
    		jb1=new JButton("登录");
    		jb2=new JButton("重置");
    		jb3=new JButton("退出");
    		//设置监听
    		jb1.addActionListener(this);
    		jb2.addActionListener(this);
    		jb3.addActionListener(this);
    		
    		jmb=new JMenuBar(); //JMenuBar指菜单栏
    		jm=new JMenu("选项"); //JMenu是菜单栏中的选项栏
    		jmi1=new JMenuItem("开始"); //JMenuItem指选项栏中的选项
    		jmi2=new JMenuItem("退出系统");
    		jm.add(jmi1);
    		jm.add(jmi2);
    		jmb.add(jm);
    		
    		
    		jrb1=new JRadioButton("教师",true);
    		jrb2=new JRadioButton("学生");
    		bg=new ButtonGroup();
    		bg.add(jrb1);
    		bg.add(jrb2);
    //		jrb2.setSelected(true);
    		
    		jp1=new JPanel();
    		jp2=new JPanel();
    		jp3=new JPanel();
    		jp4=new JPanel();				
    		
    		jlb1=new JLabel("用户名:");
    		jlb2=new JLabel("密    码:");
    		jlb3=new JLabel("权    限:");
    		
    		jtf=new JTextField(10);
    		jpf=new JPasswordField(10);
    		//加入到JPanel中
    		jp1.add(jlb1);
    		jp1.add(jtf);
    		
    		jp2.add(jlb2);
    		jp2.add(jpf);
    		
    		jp3.add(jlb3);
    		jp3.add(jrb1);
    		jp3.add(jrb2);
    		
    		jp4.add(jb1);
    		jp4.add(jb2);
    		jp4.add(jb3);
    		
    		//加入JFrame中
    		this.setJMenuBar(jmb);
    		this.add(jp1);
    		this.add(jp2);
    		this.add(jp3);
    		this.add(jp4);
    		//设置布局管理器
    		this.setLayout(new GridLayout(4,1));
    		//给窗口设置标题
    		this.setTitle("学生成绩管理系统");
    		//设置窗体大小
    		this.setSize(300,250);
    		//设置窗体初始位置
    		this.setLocation(200, 150);
    		//设置当关闭窗口时,保证JVM也退出
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//显示窗体
    		this.setVisible(true);
    		this.setResizable(true);
    		
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    
    		if(e.getActionCommand()=="退出")
    		{
    			System.exit(0);
    		}else if(e.getActionCommand()=="登录")
    		{
    			if(!jtf.getText().isEmpty() && !jpf.getText().isEmpty())
    			{
    				//当点击登录按钮时,首先与数据库建立连接
    				GetSQL.ConnectSQL();
    				//如果选中教师登录
    				if(jrb1.isSelected())
    				{
    					GetSQL.querytea("教师",jtf.getText());
    					//首先判断是否存在该用户,即是否得到了密码
    					if(GetSQL.pwd ==null)
    					{
                             this.clear();
    					}else
    					{
    						//调用登录方法
    						this.tealogin();
    					}
    				}else if(jrb2.isSelected()) //学生在登录系统
    				{
    					GetSQL.querystu("学生",jtf.getText());
    					//首先判断是否存在该用户,即是否得到了密码
    					if(GetSQL.pwd ==null)
    					{
                             this.clear();
    					}else
    					{
    						//调用登录方法
    						this.stulogin();
    					}
    				   
    				}
    			}else if(jtf.getText().isEmpty())
    			{
    				JOptionPane.showMessageDialog(null,"请输入用户名","提示消息",JOptionPane.WARNING_MESSAGE);
    			    this.clear();
    			}else if(jpf.getText().isEmpty())	
    			{
    				JOptionPane.showMessageDialog(null,"请输入密码","提示消息",JOptionPane.WARNING_MESSAGE);
    			    this.clear();
    			}
    		}else if(e.getActionCommand()=="重置")
    		{
    			this.clear();
    		}			
    		
    	}
    				
    		//清空文本框和密码框
    	public	void clear()
    		{
    			jtf.setText("");
    			jpf.setText("");
    		}
    		    //学生登录判断方法
    			public void stulogin()
    			{
    				if(GetSQL.pwd.equals(jpf.getText()))
    				{
    //					System.out.println("登录成功");
    					JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    					this.clear();
    					//关闭当前界面
    					 dispose();
    					 //创建一个新界面
    					 Stu_UI6 ui=new Stu_UI6();
    				}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else if(jtf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else if(jpf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else
    				{
    					JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
    				    //清空输入框
    					this.clear();
    				}
    			}
    			
    			//教师登录判断方法
    			public void tealogin()
    			{
    				if(GetSQL.pwd.equals(jpf.getText()))
    				{
    //					System.out.println("登录成功");
    					 JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
    					 this.clear();	
    					//关闭当前界面
    					 dispose();
    					 //创建一个新界面,适用于教师来管理学生
    					Teacher6 t=new Teacher6();				 					
    				}else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else if(jtf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else if(jpf.getText().isEmpty())
    				{
    					JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE);
    				}else
    				{
    					JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
    				    //清空输入框
    					this.clear();
    				}
    			}
    		
    }
    

    SQL.java

    /*
     * 功能:用来和数据库SQLserver进行连接,以及相应的查询方法。
     */
    package com.package_7;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import javax.swing.JOptionPane;
    
    //写一个类,用来与数据库建立连接,并且查询数据
    class GetSQL {
    	// 设定用户名和密码
    	static String userword;
    	static String pwd;
    	
    	static String english;
    	static String num;
    	static String name;
    	static String chinese;
    	static String zhengzhi;
    	static String math;
    	
    	static String age;
    	static String salary;
    	static String sex;
    	static String zhicheng;
    	static String teanum;
    	static String teaname;
    
    	static Connection ct = null;
    	static PreparedStatement ps = null;
    	static ResultSet rs = null;
    
    	// 用于连接数据库的方法,可用于子类的继承
    	public static void ConnectSQL() {
    		try {
    			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    			ct = DriverManager.getConnection("jdbc:odbc:ywq");
    			System.out.println("The SQL is connected");
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    	// 用于向数据库进行查询的方法
    	public static void querystu(String s,String username) {
    		// 创建火箭车
    		try {
    			ps = ct.prepareStatement("select * from info where 权限=? and 用户名=? ");
    			// 给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式
    			ps.setString(1, s);
    			ps.setString(2, username);
    			// ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集
    			rs = ps.executeQuery();
    			// 循环取出
    			if (rs.next()) {
    				// 将教师的用户名和密码取出
    				userword = rs.getString(2);
    				pwd = rs.getString(3);
    				System.out.println("成功获取到密码和用户名from数据库");
    				System.out.println(userword + "\t" + pwd + "\t");
    			}else
    			{
    				JOptionPane.showMessageDialog(null, "没有此用户,请重新输入!", "提示消息", JOptionPane.WARNING_MESSAGE);
    			}
    		} catch (Exception e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    	}
    	//在教师表中进行查询
    	public static void querytea(String s,String name ) {
    		// 创建火箭车
    		try {
    			ps = ct.prepareStatement("select * from info_tea where 权限=? and 用户名=? ");
    			// 给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式
    			ps.setString(1, s);
    			ps.setString(2, name);
    			// ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集
    			rs = ps.executeQuery();
    			// 循环取出
    			if (rs.next()) {
    				// 将教师的用户名和密码取出
    				userword = rs.getString(2);
    				pwd = rs.getString(3);
    				System.out.println("成功获取到密码和用户名from数据库");
    				System.out.println(userword + "\t" + pwd + "\t");
    			}else
    			{
    				JOptionPane.showMessageDialog(null, "没有此用户,请重新输入!", "提示消息", JOptionPane.WARNING_MESSAGE);
    			}
    		} catch (Exception e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    	}
    
    	//从数据库中根据学号或者教工号来查询数据,并且填入表格。
    	public static void getdatastu(String s) {
    		// 创建火箭车
    		try {
    			ps = ct.prepareStatement("select * from info where 学号 =? ");
    			// 给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式
    			ps.setString(1, s);
    			// ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集
    			rs = ps.executeQuery();
    			if(rs.next())	
    			{
    				// 将教师的用户名和密码取出
    				num = rs.getString(4);
    				name = rs.getString(5);
    				math = rs.getString(6);
    				chinese = rs.getString(7);
    				english = rs.getString(8);
    				zhengzhi = rs.getString(9);
    			}else
    			{
    				JOptionPane.showMessageDialog(null, "沒有此学生,请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
    			}
    	
    		} catch (Exception e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    	}
    	public static void getdatatea(String s) {
    		// 创建火箭车
    		try {
    			ps = ct.prepareStatement("select * from info_tea where 教师编号号 =? ");
    			// 给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式
    			ps.setString(1, s);
    			// ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集
    			rs = ps.executeQuery();
    			if(rs.next())	
    			{
    				// 将教师的用户名和密码取出
    				teanum = rs.getString(4);
    				teaname = rs.getString(5);
    				sex = rs.getString(6);
    				salary = rs.getString(7);
    				zhicheng = rs.getString(8);
    				age = rs.getString(9);
    			}else
    			{
    				JOptionPane.showMessageDialog(null, "沒有此教师,请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
    			}
    	
    		} catch (Exception e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    	}
    	
    }


    Stu_UI6.java

    /*
     * 功能:学生登录成功界面。
     * 
     */
    package com.package_7;
    
    import java.awt.*;
    import java.awt.event.*;
    
    import javax.swing.*;
    
    public class Stu_UI6 extends JFrame implements ActionListener
    {
    
    	     //定义组件
    		JButton jb1,jb2=null;
    		JPanel jp1,jp2,jp3=null;
    		JLabel jlb1,jlb2,jlb3,jlb4=null;
    		
    //		public static void main(String[] args) {
    //			// TODO Auto-generated method stub
    //			Stu_UI6  ui=new Stu_UI6();
    //		}	
    	    //构造函数
    		public  Stu_UI6()    //不能申明为void!!!!!否则弹不出新界面
    		{
    			//创建组件
    			jb1=new JButton("课程管理");
    			jb2=new JButton("成绩查询");
    			
    			jp1=new JPanel();
    			jp2=new JPanel();
    			jp3=new JPanel();
    			
    			jlb1=new JLabel("姓名");
    			jlb2=new JLabel("学号");
    			jlb3=new JLabel("最新公告:");
    			jlb4=new JLabel("我校举行六十周年校庆的通知");
    			
    			jp1.add(jlb1);
    			jp1.add(jlb2);
    			
    			jp2.add(jb1);
    			jp2.add(jlb3);
    			
    			jp3.add(jb2);
    			jp3.add(jlb4);
    			
    			
    			this.add(jp1);
    			this.add(jp2);
    			this.add(jp3);
    			
    			//设置布局管理器
    			this.setLayout(new GridLayout(3,3,50,50));
    			this.setTitle("学生成绩管理系统");
    			this.setSize(400,300);
    			this.setLocation(200, 200);		
    			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			this.setVisible(true);
    
    }
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			// TODO Auto-generated method stub
    			
    		}
    }
    

    Teacher.java

     

    /*
     * 功能:实现了查询学生和老师的信息,并且显示在表格中的功能。
     */
    
    package com.package_7;
    
    import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class Teacher6 extends JFrame implements ActionListener {
    
    	// 定义组件
    	JLabel jl2,jl,jl3,jl4 = null;
    	JTextField jtf,jtf2 = null;
    	JButton jb,jb2 = null;
    	JPanel jp1, jp2,jp3,jp4,jp5,jp6 = null;
    
    	DefaultTableModel model,model2 = null;
    	JTable table,table2 = null;
    	JScrollPane jsp,jsp2 = null;
    
    //	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    //		Teacher6 t = new Teacher6();
    //	}
    
    	// 构造函数
    	public Teacher6() {
    		// 创建组件		
    		jl = new JLabel("请输入学号:");
    		jl2=new JLabel("请输入教工号:");	
    		
    		jl3=new JLabel("学生信息表:");
    		jl4=new JLabel("教师信息表:");
    		
    		jtf = new JTextField(10);
    		jtf2 = new JTextField(10);
    		jb = new JButton("查询1");
    		jb2 = new JButton("查询2");
    		// 设置监听
    		jb.addActionListener(this);
    		jb2.addActionListener(this);
    		// 设置表格1
    		String[] colnames = { "姓名", "学号", "数学", "语文", "英语", "政治" };
    		model = new DefaultTableModel(colnames, 3);
    		table = new JTable(model);
    		jsp = new JScrollPane(table);
    		//设置表格2
    		String[] col = { "姓名", "教工号", "性别", "工资", "职称", "年龄" };
    		model2 = new DefaultTableModel(col, 3);
    		table2 = new JTable(model2);
    		jsp2 = new JScrollPane(table2);
    		
    
    		jp1 = new JPanel();
    		jp2 = new JPanel();
    		jp3 = new JPanel();
    		jp4 = new JPanel();
    		jp5 = new JPanel();
    		jp6 = new JPanel();
    		jp5.setLayout(new BorderLayout());
    		jp6.setLayout(new BorderLayout());
    
    		jp1.add(jl);
    		jp1.add(jtf);
    		jp1.add(jb);
    		jp1.setLayout(new FlowLayout(FlowLayout.LEFT));
    		jp1.setPreferredSize(new Dimension(20,20));
    		
    		jp3.add(jl2);
    		jp3.add(jtf2);
    		jp3.add(jb2);
    		jp3.setLayout(new FlowLayout(FlowLayout.LEFT));
    
    		jp2.add(jsp);
    		jp4.add(jsp2);
    		
    		jp5.add(jl3,BorderLayout.SOUTH);
    		jp6.add(jl4,BorderLayout.SOUTH);
    
    		this.add(jp1);
    		this.add(jp5);
    		this.add(jp2);
    		this.add(jp3);
    		this.add(jp6);
    		this.add(jp4);
    		
    		this.setLayout(new GridLayout(6, 1));
    		this.setTitle("学生成绩管理系统—教师");
    		this.setSize(500, 500);
    		this.setLocation(150, 150);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    		this.setResizable(false);
    		
    
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    
    		if (e.getActionCommand().equals("查询1")  &&!jtf.getText().isEmpty()) {						
    			// 当点击查询按钮1时,首先与数据库建立连接
    			GetSQL.ConnectSQL();
    			GetSQL.getdatastu(jtf.getText());
    			jtf.setText("");
    //			System.out.println(GetSQL.english);
    //			System.out.println(GetSQL.chinese);
    			// 将数据填入表格	
    			table.setValueAt(GetSQL.name, 0, 0);
    			table.setValueAt(GetSQL.num, 0, 1);
    			table.setValueAt(GetSQL.math, 0, 2);
    			table.setValueAt(GetSQL.chinese, 0, 3);
    			table.setValueAt(GetSQL.english, 0, 4);
    			table.setValueAt(GetSQL.zhengzhi, 0, 5);				
    				
    		}else if (e.getActionCommand().equals("查询2")  &&!jtf2.getText().isEmpty())
    		{
    			// 当点击查询按钮1时,首先与数据库建立连接
    			GetSQL.ConnectSQL();
    			GetSQL.getdatatea(jtf2.getText());
    			jtf2.setText("");
    
    			// 将数据填入表格				
    			table2.setValueAt(GetSQL.teaname, 0, 0);
    			table2.setValueAt(GetSQL.teanum, 0, 1);
    			table2.setValueAt(GetSQL.sex, 0, 2);
    			table2.setValueAt(GetSQL.salary, 0, 3);
    			table2.setValueAt(GetSQL.zhicheng, 0, 4);
    			table2.setValueAt(GetSQL.age, 0, 5);
    		}else
    		{
    			JOptionPane.showMessageDialog(null , "请输入要查询的编号","提示消息",JOptionPane.WARNING_MESSAGE);
    		}
    
    	}
    }
    
    

    其中,数据库数据如图所示:

    此处是分别建立了两张表,表结构更加复杂一点,博主在当时没有保存下来,后续补了一份sql文件,需要的可以加群366533258获取sql文件。2019.01.02

     

    在前面的数据库查询中,使用了

    ps=ct.prepareStatement("select * from info where 权限=? ");

    这条语句,是依次将数据库中的权限“学生”或者"教师"的数据全部取出来,进行判断时,会产生错误。因为其将最后一个数据复制给了username和password。

     

    改进方法:

    ps = ct.prepareStatement("select * from info where 权限=? and 用户名=? "); 

    此条语句按照jtf.getText()来进行查询,如果查到此用户名则判断密码是否正确。否则将弹出“用户名不存在的提示”,较好的解决了查询问题。

    如图所示:

     

    教师登录成功界面,如图:

     

    在此系统中,可以对数据库中学生表和教师表中的信息进行查询,按照提示,可输入学号和教工号来实现。

    如图所示:

     

    说说经验之谈,在构建表格的时候,列名怎么也不出现。

    查阅资料后发现,只有将JTable加入到JScrollPane中才会显示列名。代码如下:

    // 设置表格1
            String[] colnames = { "姓名", "学号", "数学", "语文", "英语", "政治" };

            model = new DefaultTableModel(colnames, 3);

            table = new JTable(model);

            jsp = new JScrollPane(table);

    然后将JScrollPane添加进一个JPanel中,实现了表格的设置。

     

    至于点击查询按钮所进行的查询工作就和前面大同小异了。当输入的学号或者教工号不存在时,会给出一个提示。如图所示:



    总结:

    简易信息管理系统适合新手学Java图形界面开发。

    1、登录界面可以进行登录操作。有俩种权限选择。分别跳转到不同的界面。

    2、使用了事件监听、Java操作SQLserver数据库等知识。

    3、图形化界面中使用了JTable等组件,将查询结果显示在表格中。

     

    其实,在这个简单的程序中,至少我可以看出可以使用单例模式和门面模式。

    Java设计模式—门面模式(带案例分析)                    

    Java图形界面开发—简易登录注册小程序

     


     如果大家想直接使用本文中创建的模板,那么只需要将最后一步的各个Java文件copy出来即是一个完整的Java程序(当然你还需要一份数据库的建表sql文件),希望能够帮助更多正在学习图形界面开发的小伙伴~

    如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以加群 366533258 交流讨论哈~

     

    关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~

     

    展开全文
  • Java图形界面编程

    万次阅读 多人点赞 2019-02-23 22:23:45
    一、Java图形用户界面(gui)介绍 1、Java GUI简介   图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作。   Sun已经提供了一个跨平台GUI开发工具包AWT...

    一、Java图形用户界面(gui)介绍

    1、Java GUI简介

      图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作。

      Sun已经提供了一个跨平台GUI开发工具包AWT抽象窗口工具箱(Abstract Window Toolkit)。
      Sun又创建了一个新的GUI框架swing。解决了AWT存在的Icd问题。
      IBM认为swing比较消耗内存,创建了一个新的GUI库,这就是SWT。
      IBM为了方便开发SWT程序,在SWT基础上又创建了一个更易用,功能强大的图开包"JFace"。
      AWT(Abstract Window Toolkit):抽象窗口工具包,早期编写图形界面应用程序的包。 AWT的图形函数与操作系统提供的图形函数有着一一对应的关系。也就是说,当我们利用 AWT构件图形用户界面的时候,实际上是在利用操作系统的图形库。
    AWT的层次关系

      Swing:为解决 AWT 存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。 不仅提供了AWT 的所有功能,还用纯粹的Java代码对AWT的功能进行了大幅度的扩充,与平台无关。
    Swing组件层次关系


    2、AWT和Swing的区别与联系

      AWT和Swing都是java中的包。
      AWT(Abstract Window Toolkit):抽象窗口工具包,早期编写图形界面应用程序的包。
      Swing:为解决 AWT 存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。
      AWT和Swing的实现原理不同:
      AWT的图形函数与操作系统提供的图形函数有着一一对应的关系。也就是说,当我们利用 AWT构件图形用户界面的时候,实际上是在利用操作系统的图形库。
      不同的操作系统其图形库的功能可能不一样,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT不得不通过牺牲功能来实现平台无关性。因此,AWT 的图形功能是各操作系统图形功能的“交集”。
      因为AWT是依靠本地方法来实现功能的,所以AWT控件称为“重量级控件”。
      而Swing,不仅提供了AWT 的所有功能,还用纯粹的Java代码对AWT的功能进行了大幅度的扩充。例如:并不是所有的操作系统都提供了对树形控件的支持,Swing则利用了AWT中所提供的基本作图方法模拟了一个树形控件。
      由于 Swing是用纯粹的Java代码来实现的,因此Swing控件在各平台通用。因为Swing不使用本地方法,故Swing控件称为“轻量级控件”。
      AWT和Swing之间的区别:
      1)、AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。
      2)、AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。
      在实际应用中,应该使用AWT还是Swing取决于应用程序所部署的平台类型。例如:
      1)、对于一个嵌入式应用,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT当然成了嵌入式Java的第一选择。
      2)、在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素。所以在标准版的Java中则提倡使用Swing,也就是通过牺牲速度来实现应用程序的功能。
      在java中,AWT包的名称是java.awt,Swing包的名称是javax.swing。

    二、Swing的基本使用

    1、几个常用的组件

      1、文本框(JTextField)
      2、密码框(JPasswordField)
      3、标签(JLable)
      4、复选框组件(JCheckBox)
      5、单选框组件(JRadioButton):同一组单选按钮必须先创建ButtonGroup,然后把单选框组件放入到ButtonGroup中。


      6、下拉框(JComboBox)
      7、列表框(JList)
      8、滚动窗格(JScrollPane)

      9、列表框(JList)和滚动窗格(JScrollPane)一般会一起使用。
      10、拆分窗格(JSpitPane):属于容器类组件。
      11、JTextArea:多行文本框。
      12、JTabbedPane:选项卡窗格(业签组件)。
      13、JMenuBar:菜单条组件
      14、JMenu:菜单组件
      15、JMenuItem:菜单项组件
      16、JToolBar:容器类组件

    2、Java布局管理

      Java为我们提供了几个常用的布局管理器类,例如:FlowLayout、BorderLayout、GridLayout、GridBagLayout等。
      1、java.awt FlowLayout(流布局)将组件按从左到右而后从上到下的顺序依次排列,一行不能放完则折到下一行继续放置。流式布局可以以左对齐、居中对齐、右对齐的方式排列组件。

      流式布局不限制他所管理的组件的大小,允许他们有最佳的大小。当容器最缩放时,组件的位置可以改变,但组件的大小不改变。JPanel的默认布局为流式布局管理。
      2、java.awt BorderLayout(边界布局)将组件按东、南、西、北、中五个区域放置,每个方向最多只能放置一个组件。

      JFrame窗体,JDialog对话框组件默认布局方法为边界布局(BorderLayout),边界布局的五个部分不是都要添加,中间部分会自动调节大小。
      3、java.awt GridLayout(网格布局)形似一个无框线的表格,每个单元格中放一个组件。将容器分割成多行多列,组件被填充到每个网格中,添加到容器中的组件首先放置在左上角的网格中,然后从左到右放置其他组件,当占满该行的所有网格后,接着继续在下一行从左到右放置组件。

      组件的相对位置不随容器的缩放而改变,但大小会改变,所有组件的大小相同。
      可以通过GridLayout(int rows, int cols, int hgap, int vgap)来指定网格的行/列,水平间隙/垂直间隙。
      java.awt GridBagLayout 非常灵活,可指定组件放置的具体位置及占用单元格数目。


      4、一个界面只可以有一个JFrame窗体组件,但可以有多个Jpanel面板组件,而JPanel上也可使用各种布局管理器,这样可以组合使用达到较为复杂的布局效果。
      JPanel是JComponent的子类。默认布局为流式布局(FlowLayout),属于容器类组件,可以加入别的组件。

    import java.awt.BorderLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class MultiLayout extends JFrame {
        private static final long serialVersionUID = 1L;
        
        // 定义组件
        JPanel jp1, jp2;
        JButton jb1, jb2, jb3, jb4, jb5, jb6;
    
        public static void main(String[] args) {
            new MultiLayout();
        }
    
        public MultiLayout() {
            // 创建组件
            // JPanel布局默认是FlowLayout流布局
            jp1 = new JPanel();
            jp2 = new JPanel();
    
            jb1 = new JButton("西瓜");
            jb2 = new JButton("苹果");
            jb3 = new JButton("荔枝");
            jb4 = new JButton("葡萄");
            jb5 = new JButton("桔子");
            jb6 = new JButton("香蕉");
    
            // 设置布局管理器(Jpanel默认流布局)
            jp1.add(jb1);
            jp1.add(jb2);
            jp2.add(jb3);
            jp2.add(jb4);
            jp2.add(jb5);
    
            // 把Panel加入JFrame
            this.add(jp1, BorderLayout.NORTH);
            this.add(jb6, BorderLayout.CENTER);
            this.add(jp2, BorderLayout.SOUTH);
    
            // 设置窗体
            // 窗体大小
            this.setSize(300, 250);
            // 屏幕显示初始位置
            this.setLocation(200, 200);
            // 显示
            this.setVisible(true);
            // 退出窗体后将JFrame同时关闭
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    

      5、GroupLayout(分组布局),它将组件按层次分组,以决定它们在 Container 中的位置。GroupLayout 主要供生成器使用,但也可以手工编码。分组由 Group 类的实例来完成。GroupLayout 支持两种组。串行组 (sequential group) 按顺序一个接一个地放置其子元素。并行组 (parallel group)能够以四种方式对齐其子元素。
      每个组可以包含任意数量的元素,其中元素有 Group、Component 或间隙 (gap)。间隙可被视为一个具有最小大小、首选大小和最大大小的不可见组件。此外,GroupLayout 还支持其值取自 LayoutStyle 的首选间隙。
      GroupLayout是一个很重要的布局管理器,在jdk 1.6才加入,配合其它的管理器可以实现很好的界面。GroupLayout必须要设置它的GroupLayout.setHorizontalGroup和GroupLayout.setVerticalGroup。
      GroupLayout.setHorizontalGroup是指按照水平来确定,下面例子“账号”和“密码”是一个级别的,其它的组件也是一个级别的。
      GroupLayout.setVerticalGroup。是按照垂直来确定的。他们的级别是按照Group去设置组件的优先级别,级别越高就显示越上面。

    import javax.swing.GroupLayout;
    import javax.swing.GroupLayout.Alignment;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPasswordField;
    import javax.swing.JRadioButton;
    import javax.swing.JTextField;
    
    public class GroupLayoutTest extends JFrame {
        private static final long serialVersionUID = -5159330521192113057L;
    
        public static void main(String[] args) {
            new GroupLayoutTest();
        }
    
        JLabel label1;
        JLabel label2;
        JLabel label3;
        JTextField tf;
        JPasswordField psf;
        JRadioButton rb1;
        JRadioButton rb2;
        JButton bt1;
        JButton bt2;
    
        public GroupLayoutTest() {
            this.setVisible(true);
            this.setSize(250, 220);
            this.setVisible(true);
            this.setLocation(400, 200);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            label1 = new JLabel("登陆界面");
            label2 = new JLabel("账号:");
            label3 = new JLabel("密码:");
            tf = new JTextField();
            psf = new JPasswordField();
            rb1 = new JRadioButton("记住密码");
            rb2 = new JRadioButton("自动登陆");
            bt1 = new JButton("登陆");
            
            // 为指定的 Container 创建 GroupLayout
            GroupLayout layout = new GroupLayout(this.getContentPane());
            this.getContentPane().setLayout(layout);
            
            // 创建GroupLayout的水平连续组,,越先加入的ParallelGroup,优先级级别越高。
            GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
            // 添加间隔
            hGroup.addGap(5);
            hGroup.addGroup(layout.createParallelGroup().addComponent(label2).addComponent(label3));
            hGroup.addGap(5);
            hGroup.addGroup(layout.createParallelGroup().addComponent(label1).addComponent(psf).addComponent(rb1)
                    .addComponent(rb2).addComponent(tf).addComponent(bt1));
            hGroup.addGap(5);
            // 设置水平分组
            layout.setHorizontalGroup(hGroup);
            
            // 创建GroupLayout的垂直连续组,,越先加入的ParallelGroup,优先级级别越高。
            GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
            vGroup.addGap(10);
            vGroup.addGroup(layout.createParallelGroup().addComponent(label1));
            vGroup.addGap(10);
            vGroup.addGroup(layout.createParallelGroup().addComponent(label2).addComponent(tf));
            vGroup.addGap(5);
            vGroup.addGroup(layout.createParallelGroup().addComponent(label3).addComponent(psf));
            vGroup.addGroup(layout.createParallelGroup().addComponent(rb1));
            vGroup.addGroup(layout.createParallelGroup().addComponent(rb2));
            vGroup.addGroup(layout.createParallelGroup(Alignment.TRAILING).addComponent(bt1));
            vGroup.addGap(10);
            // 设置垂直组
            layout.setVerticalGroup(vGroup);
        }
    
    }
    



    三、Java绘图技术

      坐标原点位于左上角,以像素为单位。像素是计算机屏幕上最小的显示单位。在java的坐标系中,第一个是X坐标,表示当前位置为水平方向,距离坐标原点X个像素;第二个是Y坐标,表示当前位置为垂直方向,距离坐标原点Y个像素。

      计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显示更多的像素。因此,像素是一个密度单位,而厘米是长度单位,两者无法比较。
      Component类提供了两个和绘图相关最重要的方法:
      1、paint(Graphics g)绘制组件的外观;
      2、repaint()刷新组件的外观。
      当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件,在以下情况paint()将会被调用:
      1、窗口最小化,再最大化;
      2、窗口的大小发生变化;
      3、repaint函数被调用。

    1、Graphics类

      Graphics类可以理解就是画笔,为我们提供了各种绘制图形的方法:
      1、画直线 drawLine(int x1, int y1, int x2, int y2);
      2、画矩形边框 drawRect(int x, int y, int width, int height);
      3、画椭圆边框 drawOval(int x, int y, int width, int height);
      4、填充矩形 fillRect(int x, int y, int width, int height);
      5、填充椭圆 fillOval(int x, int y, int width, int height);
      6、画图片 drawImage(Image img, int x, int y,…);
      7、画字符串 drawString(String str, int x, int y);
      8、设置画笔的字体 setFont(Font font);
      9、设置画笔的颜色 setColor(Color c);

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class GraphicsTest extends JFrame {
        // 定义组件
        MyPanel1 mp = null;
        public static void main(String[] args) {
            new GraphicsTest();
        }
    
        public GraphicsTest() {
            // 构建组件
            mp = new MyPanel1();
            // 加入组件
            this.add(mp);
            
            // 设置窗体
            this.setSize(400, 300);
            this.setVisible(true);
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    
    /**
     * @Description: 定义一个MyPanel(我自己的面板是用于绘图和显示绘图的区域)
     */
    class MyPanel1 extends JPanel {
        private static final long serialVersionUID = 1L;
    
        // 重写(覆盖)JPanel的paint方法
        public void paint(Graphics g) {
            // 1、调用父类函数,完成初始化任务
            super.paint(g);
            // 画一个直线
            g.drawLine(10, 10, 40, 10);
            // 画矩形边框
            g.drawRect(50, 50, 40, 40);
            // 画椭圆边框
            g.drawOval(130, 130, 60, 60);
            // 画填充矩形
            g.setColor(Color.blue);
            g.fillRect(10, 150, 70, 70);
            
            // 画填充椭圆
            // 设置画笔颜色
            g.setColor(Color.red);
            g.fillOval(270, 140, 100, 80);
    
            // 如何画出字
            g.setColor(Color.red);
            g.setFont(new Font("黑体", Font.BOLD, 40));
            g.drawString("祖国万岁", 150, 100);
            // 画弧形
            g.drawArc(100, 100, 120, 200, 50, 100);
        }
    }
    



    2、Graphics2D类

      Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。
      绘图属性
      Graphics2D定义了几种方法,用于添加或改变图形的状态属性。可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式;设定平移、旋转、缩放或修剪变换图形;以及设定填充图形的颜色和图案等。图形状态属性用特定的对象存储。

    2.1、stroke属性

      stroke属性控制线条的宽度、笔形样式、线段连接方式或短划线图案。该属性的设置需要先创建BasicStroke对象,再调用setStroke()方法来设置。创建BasicStroke对象的方法有:
      BasicStroke(float w):指定线条宽w。
      BasicStroke(float w, int cap, int join):
      cap是端点样:CAP_BUTT(无修饰),CAP_ROUND(半圆形末端),CAP_SQUARE(方形末端,默认值)。
      Join定义两线段交汇处的连接方式:JOIN_BEVEL(无修饰),JOIN_MTTER(尖形末端,默认值),JOIN_ROUND(圆形末端)。

    2.2、paint属性

      paint属性控制填充效果。先调用以下方法确定填充效果,理用setPaint()方法设置。
      GradientPaint(float x1, float y1, Color c1, float x2, flaot y2, Color c2):从(x1, y1)到(x2, y2)颜色从c1渐变到c2。其中:参数c1, c2决定这个渐变色是从颜色c1渐变到颜色c2。参数x1, y1, x2, y2决定了渐变的强弱,即要求从点(x1, y1)出发到达点(x2, y2),颜色从c1变成c2。
      GradientPaint(float x1, float y1, Color c1, float x2, float y2, Color c2, Boolean cyclic):如果希望渐变到终点又是起点的颜色,应将cyclic设置为true。

    2.3、transform属性

      transform 属性用来实现常用的图形平移、缩放和斜切等变换操作。首先创建AffineTransform对象,然后调用setTransform()方法设置transform属性。最后,用具有指定属性的Graphics2D对象绘制图形。创建AffineTransform对象的方法有:
      getRotateinstrance(double theta):旋转theta弧度。
      getRotateInstance(double theta, dioble x, double y):绕旋转中心(x, y)旋转。
      getScaleInstance(double sx, double sy):x和y 方向分别按sx, sy比例变换。
      getTranslateInstance(double tx, double ty):平移变换。
      getShearInstance(double shx, double shy):斜切变换,shx和shy指定斜拉度。
      也可以先创建一个没有transform属性的AffineTransform对象,然后用以下方法指定图形平移、旋转、缩放变换属性。
      transelate(double dx, double dy):将图形在x轴方向平移dx像素。
      scale(double sx, double sy):图形在x轴方向缩放sx倍,纵向缩放sy倍。
      rotate(double arc, double x, double y):图形以点(x, y)为轴点,旋转arc弧度。
      例如,创建AffineTransform对象:
      AffineTransform trans = new AffineTransform();
      为AffineTransform对象指定绕点旋转变换属性:
      Trans.rotate(50.0*3.1415927/180.0,90,80);
      接着为Graphics2D 的对象g2d设置具有上述旋转变换功能的“画笔”:
      Graphics2D g2d = (Graphics2D)g; g2d.setTranstorm(trans);
      最后,以图形对象为参数调用具有变换功能的Graphics2D 对象的draw()方法。例如,设已有一个二次曲线对象curve,以下代码实现用上述旋转功能的g2d对象绘制这条二次曲线:
      g2d.draw(curve);

    2.4、clip属性

      clip属性用于实现剪裁效果。设置剪裁属性可调用setClip()方法确定剪裁区的Shape。连续多个setClip()得到它们交集的剪裁区。

    2.5、composit属性

      composit属性设置图形重叠区域的效果。先用方法AlphaComposite.getInstance(int rule, float alpha)得到AlphaComposite对象,再通过setComposite()方法设置混合效果。Alpha值的范围为0.0f(完全透明)-0.1f(完全不透明)。

    2.6、Graphics2D类的绘图方法

      Graphics2D类仍然保留Graphics类的绘图方法,同时增加了许多新方法。新方法将几何图形(线段、圆等)作为一个对象来绘制。在java.awt.geom包中声明的一系列类,分别用于创建各种身体图形对象。主要有:
      Line2D线段类,RoundRectangle2D圆角矩形类,Ellipse2D椭圆类,Arc2D圆弧类,QuadCurve2D二次曲线类,CubicCurve2D三次曲线类。
      要用Graphics2D类的新方法画一个图形。先在重画方法paintComponent()或paint()中,把参数对象g强制转换成Graphics2D对象;然后,用上述图形类提供的静态方法Double()创建该图形的对象;最后,以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形。例如以下代码用Graphics2D的新方法绘制线段和圆角矩形:
      // 将对象g类型从Graphics转换成Graphics2D
      Graphics2D g2d = (Graphics2D)g;
      Line2D line = new Line2D.Double(30.0, 30.0, 340.0, 30.0);
      g2d.draw(line);
      RoundRectangle2D rRect = new RoundRectangle2D.Double(13.0, 30.0, 100.0, 70.0, 40.0, 20.0);
      g2d.draw(rRect);
      也可以先用java.awt.geom包提供的Shape对象,并用单精度Float坐标或双精度Double坐标创建Shape对象,然后再用draw()方法绘制。例如,以下代码先创建圆弧对象,然后绘制圆弧:
      Shape arc = new Arc2D.Float(30, 30, 150, 150, 40, 100, Arc2D.OPEN);
      g2d.draw(arc); //绘制前面创建的图形对象arc.

      Graphics2D的几何图形类
      1、线段:
      // 声明并创建线段对象(起点是(2,3),终点是(200,300))
      Line2D line = new Line2D.Double(2,3,200,300);
      2、矩形:
      // 声明并创建矩形对象,矩形的左上角是(20,30),宽是300,高是40。
      Rectangle2D rect = new Rectangle2D.Double(20, 30, 80, 40);
      3、圆角矩形:
      // 左上角是(20,30),宽是130,高是100,圆角的长轴是18,短轴是15。
      RoundRectangle2D rectRound = new RoundRectangle2D.Double(20, 30, 130, 100, 18, 15);
      4、椭圆:
      // 左上角 (20,30),宽是100,高是50
      Ellipse2D ellipse = new Ellipse2D.Double(20, 30, 100, 50);
      5、圆弧:
      // 外接矩形的左上角(10,30),宽85,高60,起始角是5度,终止角是90度。
      Arc2D arc1 = new Arc2D.Double(10, 30, 85, 60, 5, 90, Arc2D.OPEN);
      Arc2D arc2 = new Arc2D.Double(20,65,90,70,0,180,Arc2D.CHORD);
      Arc2D arc3 = new Arc2D.Double(40,110,50,90,0,270,Arc2D.PIE);
      // 参数Arc2D.OPEN、Arc2D.CHORD、Arc2D.PIE分别表示圆弧是开弧、弓弧和饼弧。
      6、二次曲线:
      二次曲线用二阶多项式表示:y(x) = ax2+bx+c。一条二次曲线需要三个点确定:始点、控制点和终点。
      QuadCurve2D curve1 = new QuadCurver2D.Double(20,10,90,65,55,115);
      QuadCurve2D curve2 = new QuadCurver2D.Double(20,10,15,63,55,115);
      QuadCurve2D curve3 = new QuadCurver2D.Double(20,10,54,64,55,115);
      // 方法Double()中的6个参数分别是二次曲线的始点、控制点和终点。以上3条二次曲线的开始点和终点分别相同。
      7、三次曲线:
      三次曲线用三阶多项式表示:y(x)=ax3+bx2+cx+d。一条三次曲线需要四个点确定:始点、两个控制点和终点。
      CubicCurve2D curve1 = new CubicCurve2D.Double(12,30,50,75,15,15,115,93);
      CubicCurve2D curve2 = new CubicCurve2D.Double(12,30,15,70,20,25,35,94);
      CubicCurve2D curve3 = new CubicCurve2D.Double(12,30,50,75,20,95,95,95);
      方法Double()中的8个参数分别是三次曲线的始点、两个控制点和终点。


      一般的方程曲线的绘制过程用一个循环控制。通过循环产生自变量的值,按照方程计算出函数值,再作必要的坐标转换:原点定位的平移变换,图像缩小或放大的缩放变换,得到曲线的图像点,并绘制这个点。以绘制以下曲线方程为例:
      Y=sin(x)+cos(x)
    绘制的部分代码可以写成如下:

    double x0, y0, x1, y1, x2, y2, scale;
    x0 = 100; y0 = 80;
    scale = 20.0;
    for(x1 = -3.1415926d; x1 <= 2*3.1415926d; x1 += 0.01d) {
        y1 = Math.sin(x1) + Math.cos(x1);
        x2 = x0 + x1 * scale; y2 = y0 + y1 * scale; //(x2,y2)是图像点
        g.fillOval((int)x2, (int)y2, 1, 1); // 画一个圆点作为图像点
    }
    

    四、事件处理机制

      Java事件处理是采取“委派事件模型”。所谓“委派事件模型”是指当事件发生时,产生事件的对象(即事件源),会把此“信息”传递给“事件的监听者”处理的一种方式,而这里所说的“信息”实际上就是java.awt.event事件类库里的某个类所创建的对象。我们暂时把它称为“事件的对象”。

      1、事件源(event source)
      事件源是一个产生(或触发)事件的对象,如文本框、按钮等。当这个事件源对象的某些状态以某种方式发生变化时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件)。如果某个组件(对象)希望得到事件源产生的事件,就需要在这个事件源上注册,一个事件源是一个能够注册监听器并且为它们发送事件对象的对象。
      2、事件(event object)
    事件就是承载事件源状态改变时的信息对象。或者说,事件是事件源事件监听器传输事件源状态信息的载体。在用户与GUI组件进行交互时就会生成事件,比如当鼠标在面板中移动时,就会生成一个鼠标移动事件的对象,而这个对象保存着当前鼠标在面板中位置信息。java.awt.event包和javax.swing.event包中定义了各种事件类型,常见的事件类有:

    事件类 说明
    ActionEvent 通常在按下按钮,或双击一个列表项或选中某个菜单时发生
    AdjustmentEvnet 当操作一个滚动条时发生
    ComponentEvent 当一个组件隐藏、移动、改变大小时发送
    ContainerEvent 当一个组件从容器中加入或者删除时发生
    FocusEvent 当一个组件获得或是失去焦点时发生
    ItemEvent 当一个复选框或是列表项被选中时,当一个选择框或选择菜单被选中
    KeyEvent 当从键盘的按键被按下,松开时发生
    MouseEvent 当鼠标被拖动、移动、点击、按下…
    TextEvent 当文本区和文本域的文本发生改变时发生
    WindowEvent 当一个窗口激活、关闭、失效、恢复、最小化…

      3、事件监听器接口
      事件源产生一个事件,可以传送给事件监听者处理,那么怎样才能编写一个事件监听者呢?
      事件监听者实际上就是一个类,该类实现了某个事件监听器接口,它就可以作为一个事件监听者,对接受到的事件进行处理。
      事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现一个事件监听接口,也可以实现多个监听接口,这些接口在java.awt.event和javax.swing.event包中定义。

    展开全文
  • Java图形化界面编程

    2020-05-22 18:33:11
    Java图形化界面编程,将学习到顶级容器、中间容器和元素组件,以及布局样式,最后通过一个案例来达到融会贯通,为大家以后能够自由地开发各种应用程序提供了保障。 代码放在最后一节课里可下载哦~
  • Java 图形界面基础

    千次阅读 多人点赞 2016-03-22 19:51:58
    Java图形界面基础

    Java图形界面基础

    当你开始验证自己的PC的JDK环境是否配置完成的时候有没有想过这个窗体是怎么做出来的呢?
    这里写图片描述
    用几句简单的Java语言就可以做出这样的窗体,不信我可以写给给位看。

    import java.awt.Frame;
    
    public class MyTest{
    public static void main(String[][]args){
    Frame w = new Frame();
    w.setSize(300,400);
    w.show;
    }
    }

    我将这段代码写入eclipse运行看看会出现什么
    这里写图片描述
    这里写图片描述
    确实是出现了一个窗体。大小是300*400
    下面我们来分析一下代码

    import java.awt.Frame

    这里的awt全名(Abstract Windowing Toolkit),是Sun公司在发布JDK1.0时一个重要的组成部分,是Java提供的用来建立和设置Java的图形界面的基本工具。AWT中所有的工具类都保存在java.awt包中,此包中的所有操作类可以用来建立与平台无关的图形界面(GUI)的类。这些类又被叫做组件(Components)。 Frame这个当然是awt这个包中的类啦,通俗的将就是要借一下awt包中的Frame类。下面的代码,main是程序入口不用解释,那么main下面的代码又怎么解释呢

    Frame w = new Frame();
    w.setSize(300,400);
    w.show;

    其实啊这个w是Frame的一个对象,new Frame()的意思就是借Frame()一用我新建一个叫w的窗体,setSize很好理解,就是字面意思设置w窗体的大小,400和300分别是长和宽,最后的show()就是展示出w窗体的意思。
    代码中的等号我要解释一下,这可和数学里的等号不是一个意思,编程语言里的等号是赋值的意思,比如说a=b,这句话在程序里的意思就是把b的值赋给a,所以等号左边通常是装东西的容器,这样的容器,Java里叫做变量。
    我们先看一下属于程序的内存是怎么管理的,下面是一个内存的示意图
    这里写图片描述
    可以看到内存被划分为两个区域,一个是栈,另一个是堆,看的出来栈相对于堆来说是很小的,栈是操作系统按照薯片桶的管理方式管理的,先放进去的薯片,会在最后被取出来,而堆没有管理限制。
    还是回到等号,见到等号,我们就要看等号右边,看到第一个单词是new,new就意味着咱堆里分配了一块内存,分配内存干什么?new 后面跟着Frame这个类,那么分配内存就是为了装Frame的对象w,也就是说,等于号的右边已经创建了对象,如图
    这里写图片描述
    那么等于号左边是干什么的,上面提到过,在Java里等于号意味着将右边的东西送到左边去,左边通常是一个变量,变量在Java里分配内存的另一个手段。既然new用于在堆里分配对象,那么对象就被放在栈里,我们已经得到了一个Frame对象,为什么还要一个变量呢?是因为我们得到的这个对象不方便操作,new的那一刻之后就没办法找到它了,如果把这个对象的地址存到一个变量里,我们以后就可以通过这个变量随时随地找到这个对象,这个变量起到了电视遥控器的作用,为了方便操作,变量也不是什么都可以装的,需要提前说明它能装什么东西,这里的声明Frame w,及时表明w是能够装Frame对象的变量,我们管这种指向对象的变量叫做引用
    这里写图片描述
    上面的这段代码我讲一个通俗一点的例子:
    你想买一台电视机,你得到了一台电视机加上一个遥控器叫做w,遥控器w上面有很多功能键,这在Java里对象的引用提供的函数就是
    w的功能键,在Java里叫做方法。
    ## Java绘图 ##
    讲完了如何创建窗体,下一步就要说怎么在窗体里做点事儿了,就是怎么在窗体里绘画。这里有一个前提,Java语言不允许直接将图形画在窗体上,必须画在一个画布上,然后将画布放到窗体上。好消息是系统直接给你提供了画布类。那么之后我将带领大家做第一项目,那就是画一个王八,这个同样是我学Java时候的第一个项目。大家可以想一想,该怎么画呢。画布类不可能提供王八的画法,所以该怎么办呢?聪明的看官老爷应该已经想到了,是不是将系统提供的画布类new 成对象,然后在这个对象上画,可以的,如果可以想到这一点,说明对Java的理解已经越来越升入了。
    但是面向对象思想意味着有另一种方式能够更好的解决这个问题。如果我有一个类叫动物,我希望得到一个人的类,你会发现动物有的一切人也有,能不能把动物拿来改造一下呢,添加上人特有的就完成对人的定义,如果这样可行,那就太棒了,因为动物类描述的内容有太多类需要了,我们因此会得到一个叫做代码重用的好处,那么这个叫做继承。人类是从动物类继承而来的,所以人类拥有动物类的一切,事实上人类也是动物,是动物类的一个特例,那么动物类咱Java的术语中被称作是父类,而人类叫做子类,有一个说法,继承自什么就是什么,人类继承自动物,所以人类就是动物。当继承的想法真的主宰了你的思路时,你就会在一切可能的情况下优先使用继承这个手段。
    回到我们这个问题里,我现在有一个类,提供了一个没有内容的画布,你希望得到一个有内容的画布,怎么办?当然是通过继承产生一个有王八的新画布,Java代码是这么写的:

    class MyPanel extends Panel{
    
    }

    新的类叫做MyPanel,注意:这是一个类与类之间的关系,不是对象与对象之间的关系,extends是关键字。也就是Java里的继承,用于实现继承的类MyPanel叫做子类,被继承的类Panel叫做父类。
    Panel 就是系统提供的空画布,问题是在整个程序前面都需要导入这个类。

    import java.awt.Panel;

    还有一个小问题,随着程序越来越大,使用的类也越来越大,一个个类导入会占据很大的区域,所以Java允许用一种简洁的方式,将镇一个包中所有的类都导入。在现代的代码中,

    import java.awt.Panel;
    w.setSize(300,400);

    可以被替换成

    import java.awt.*;

    代码是节约了,但这样会将很多不需要的类都导入进来,这个完全不用担心,因为类知识定义,并不存在,在JDK进行翻译的时候,没有被使用的类会被完全的丢弃。

    import java.awt.*;
    
    public class MyTest{
    }

    我们来看看这段新代码

    class MyPanel extends Panel{
    
    }

    继承意味着,如果Panel中有5000行的代码,那么MyPanel相当于已经拥有了5000行的代码,如果Panel里有50个方法,那么MyPanel里已经有了50个方法。方法就是之前叫做函数的东西,以后就不能用函数这个叫法了。
    如果加上一个方法aaa,继续假设Panel里已经有50个方法了,那么现在MyPanel里有多少个方法?没错就是51个,我们增加一个。

    class MyPanel extends Panel{
    public class aaa(){
    
    }
    }

    继承是面向对象的三大特征之一,是非常重要的代码手段,不过Java只支持淡了继承,也就是说一个子类只能有一个直接的父类,就好像是你只有一个亲爹一样。Java里有一个非常特殊的类叫做Object,这就是我们常说的单根结构,Object是所有类的根。比如之前写的public class MyTest(){},表面看起来这个类没有继承,他等效于public MyTest extends Object{},这意味着Object中有的成员在Java中任何类都有。
    可是我现在要增加的不是这个叫aaa的方法,而是一个叫paint的方法。

    class MyPanel extends Panel{ 
    public void paint(Graphics g){ 
    } 
    } 

    看的出来,这个paint方法不是随随便便写出来的,如果Panel里有50个方法,那么加上paint方法,现在MyPanel里依旧是50个方法,因为Panel里也有一个paint方法,这就等于说是把父类的方法重写了一遍。这个行为在Java中叫做方法的覆盖。举例来说,父亲是动物,动物会有吃喝拉撒的方法,今天我们要继承一个人出来,但是人不能使用动物的”吃”的这个方法,所以我就在人的这个类里又写了一个”吃”的方法,那么父类的”吃”的方法去哪里了,动物的”吃”不起作用了,现在人的”吃”在起作用。
    我们看paint方法的参数Graphics g,注意到的第一个字母是大写的,第一个字母大写意味着什么?说明它是一个类,这个类也包含在java.awt.*里,第一句话就给导入了。这个类是系统提供了,千万不要写错了。
    我们来仔细看看这个paint方法是干什么的。用鼠标单机菜单栏里随便一个菜单,你看到了什么?一个弹出的菜单
    这里写图片描述
    我们注意到这个弹出的菜单成为屏幕最上面的一层,他盖住了后面的内容。在今天的计算机中,这种现象比比皆是,我们可以想象目前计算机上的第一层是这个菜单,第二层是记事本,记事本下面至少还盖着一个桌面,是不是?其实这些都是假的,计算机的屏幕只能显示一层,这么多层是假的,为了欺骗大多数人,菜单的边缘甚至还画上了阴影,让眼睛误以为后面的东西还在,其实后面的东西早就没有了,在这个菜单消失后,如果后面的东西立刻显示出来,人们才能认为后面的东西并没有消失,只是被盖住了。那么是怎么做到的呢?在Dos年代其实都是这么做的,如果你的程序准备弹出这个菜单,需要先计算好要盖住的区域是哪一个部分,在显示菜单前,程序要到显卡的显存里将马上就要被盖住的内容取出来,放到内存的一个地方保管下来,在菜单消失后,立刻将刚才保管住的内容重新放到显卡的那个区域里,因为计算机的速度很快,所以可以欺骗人的眼睛。
    刚才说的都是Dos的做法,windows并不是这么做的。在Windows里,程序如果想弹出菜单,什么都不要做,就在那个地方花菜单就好了,背后的东西当然是看不见了,菜单消失就消失好了,程序还是什么都不需要做。那么背后的东西是怎么出现的呢?在windows里,计算机一直砸扫描屏幕,就像之前说的扫描键盘一样,当菜单消失的时候,windows的操作系统会立刻发现屏幕上有一个区域没人管了,于是windows就会去追查由谁来管理负责这个区域,于是windows操作系统就会给记事本发出一道命令,让记事本重新将这块区域画好。windows如何向程序下达命令?只有一个办法,调用程序中特定的方法,此前系统让一个程序运行起来,是调用main方法,现在系统让程序重画一个区域就会调用paint方法,这既是为什么要重写一个paint的原因。
    不过为何windows不按照Dos的做法来做呢?貌似Dos更加合理。谁弄得谁负责。因为Windows里用户常常会运行很多程序,大多数程序会弹出一个窗口,而且往往是全屏的,按照Dos的做法,弹出一个窗口要盖住已经存在的整个屏幕,这就意味着如果屏幕的分辨率是1024*768De话,就要消耗1024*768再乘上了区分颜色的内存空间,这样或许同时打开几个程序,为了保存被挡住的内容将内存消耗完了,Dos年代同时打开几个程序的情况很少见,所以那个时代才不是问题,而且Dos的做法也有好处,虽然浪费了内存但是节约了CPU。回头看Windows的做法,虽然节约了内存,但是CPU要做很多事情,查找哪一个窗口是当前的,要调用paint方法里的语句来画图。这是一个程序员要考虑的权衡内存和CPU之间关系的问题。
    有人说为什么main是主函数,因为main是程序的入口,现在看来好像不能这么说,paint也是程序的入口,只不过这两个方法的进入时机不同,main是程序最初运行的时候被操作系统调用的。而paint是需要画界面的时候被调用的,别的书上做的总结:
    1.在界面第一次显示的时候paint方法被调用。
    2.当窗体改变大小的时候paint被调用
    3.当窗体被盖住重新显露出来的时候paint被调用
    第三点好像根本就不用去记,你想一下,你是操作系统,你什么时候去调用paint方法呢,当然是想用的时候。
    这样我们就清楚了。你准备一个paint方法给操作系统在需要的时候调用,你是方法的提供者,操作系统就是调用者,那么Graphics就是操作系统提供的参数,是在特定的区域画图的权利,我管他叫画笔。
    那么看看画笔的遥控器g有啥子功能,专业叫法不是遥控器,叫做引用。Graphics提供了如下用于绘制图形的方法。
    drawLine:绘制直线
    drawString: 绘制字符串
    drawRect:绘制矩形
    drawRoundRect:绘制圆角矩形
    drawOval:绘制椭圆
    drawPolygon:绘制多边形边框
    drawArc:绘制圆弧
    drawPolyline:绘制折线
    fillRect:填充一个矩形
    fillRoundRect:填充一个圆角矩形
    fillOval:填充椭圆
    fillPolygon:填充一个多边形
    fillArc:填充圆弧所包围的区域
    drawImage:绘制位图
    有兴趣的可以去多了解一些Java的API手册
    下面我们来尝试用Java语言来画一条直线

       import java.awt.*;
    
    public class Test {
    
        public static void main(String args[]){
            Frame w = new Frame();
            w.setSize(300, 400);
            MyPanel mp = new MyPanel();
            w.add(mp);
            w.show();
        }
    }
    class MyPanel extends Panel{
        public void paint(Graphics g){
            g.drawLine(30, 30, 100, 100);
        }
    } 

    看一下

    g.drawLine(x1, y1, x2, y2);

    大家一眼就能看出来这是两个点的坐标,两点确定一条直线。
    MyPanel类产生一个叫mp的引用对象,将mp这个画布放到窗体w上,我们看一下运行的结果
    这里写图片描述
    那么椭圆怎么画,而且是一个有颜色的圆呢,大家可以先尝试一下然后再看我的代码

    import java.awt.*;
    
    public class Test {
    
        public static void main(String args[]){
            Frame w = new Frame();
            w.setSize(300, 400);
            MyPanel mp = new MyPanel();
            w.add(mp);
            w.show();
        }
    }
    class MyPanel extends Panel{
        public void paint(Graphics g){
            g.setColor(Color.BLUE);
            g.drawOval(30, 30, 50, 100);
        }
    }

    这里写图片描述
    setColor(Color.BLUE)用于选择颜色
    你可以用这些方法画出任何你想要的图形。下一次带大家画一个组合图形-乌龟
    或许你已经有能力可以尝试着自己画一只乌龟了 ,大家多多练习这些代码,最好可以不用过大脑就可以敲出来。
    3月22日
    5:53pm
    by WhiteJavaCoder

    展开全文
  • Java图形编程实例大全

    热门讨论 2009-12-28 11:26:41
    Java图形编程实例大全,需要学习Java图形编程的用户可以下载参考
  • Java图形界面实验

    2019-04-27 22:23:03
    Java图形界面设计 学一门编程类语言、特别是像 Java 、python 这样具有很强交互的编程类语言,图形界面是不可能避开的,我们呈现给用户的不能是只有我们自己能看懂的,或者是需要有一定编程知识的人才能看懂的应用,...

    Java图形界面设计

    学一门编程类语言、特别是像 Java 、python 这样具有很强交互的编程类语言,图形界面是不可能避开的,我们呈现给用户的不能是只有我们自己能看懂的,或者是需要有一定编程知识的人才能看懂的应用,做出让所有人都能使用的应用才是面向对象编程存在的意义,下面进行今天的实验内容。

    实验内容及要求:
    (1) 编写Application程序,在Frame中加入2个按钮(Button)和1个标签(Label),单击两个按钮,显示按钮的标签于Label。
    (2) 编写Application程序,在Frame中加入80个按钮,分20行4列,用GridLayout(网格)布局方式,按钮背景为黄色(Color.yellow),按钮文字颜色为红色(Color.red)。
    (3) 设计一个简单计算器,在“操作数”标签右侧的两个文本框输入操作数,当单击操作符+,-,×,÷按钮时,对两个操作数进行运算并将结果填入到“结果”标签右侧的文本框中。

    实验一:

    package test;
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    public class test4 extends JFrame{
     //创建JPanle对象
     private JPanel jp = new JPanel();
     //创建按钮对象
     private JButton b1=new JButton("按钮1");
     private JButton b2 =new JButton("按钮2");
      
     //创建标签对象
     private JLabel j1= new JLabel();
      
     public test4() {
      jp.add(b1);
      jp.add(b2);
      jp.add(j1);
      this.add(jp);
      this.setTitle("CHEN");
      this.setBounds(100,100,400,130);
      b1.addActionListener(new ActionListener(){
       @Override
       public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        test4.this.j1.setText("按钮一内容");
       }
      });
      b2.addActionListener(new ActionListener(){
       @Override
       public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        test4.this.j1.setText("按钮二内容");
       }
      });
      this.setBounds(100,100,400,130);
      this.setVisible(true);
     }
     public static void main(String[] args) {
      new test4();
     }
    }
    

    实验结果:

    在这里插入图片描述
    实验二:

    package test;
    import java.awt.*;
    import javax.swing.*;
    public class test5 extends JFrame {
     private JPanel jp =new JPanel();
     private JButton [] jbArray =new JButton[80];
     public test5() {
      for(int i=0;i<jbArray.length;i++) {
       jbArray[i]=new JButton("按钮"+(i+1));
       jbArray[i].setForeground(Color.red);
       jbArray[i].setBackground(Color.yellow);
       jp.add(jbArray[i]);
       jp.setLayout(new GridLayout(20,4));
      }
      this.add(jp);
      this.setTitle("网格布局");
      this.setBounds(100,100,450,200);
      this.setVisible(true);
     }
     public static void main(String[] args) {
      new test5();
     }
    }
    

    实验结果:
    在这里插入图片描述

    实验三:

    package test;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    class Calculate {
        public double cal(double data1, double data2, String op) {
            // TODO Auto-generated method stub
            double rel = 0;
            switch (op) {
            case "+":
                rel = data1 + data2;
                break;
            case "-":
                rel = data1 - data2;
                break;
            case "*":
                rel = data1 * data2;
                break;
            case "/":
                rel = data1 / data2;
                break;
            default:
                break;
            }
            return rel;
        }
    }
    public class test7 extends JFrame implements ActionListener{
     JLabel label1 = new JLabel("第一位操作数");
        JLabel label2 = new JLabel("第二位操作数");
        JLabel label3 = new JLabel("计算结果");
        JTextField textField1 = new JTextField();
        JTextField textField2 = new JTextField();
        JTextField textField = new JTextField();
        JButton button1 = new JButton("+");
        JButton button2 = new JButton("-");
        JButton button3 = new JButton("*");
        JButton button4 = new JButton("/");  
    //    JButton button = new JButton("计算");
        public test7() {
            try {
                Init();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
        private void Init() throws Exception{
            // TODO Auto-generated method stub
            getContentPane().setLayout(null);
            label1.setBounds(new Rectangle(78, 60, 105, 31));
            label2.setBounds(new Rectangle(80, 146, 87, 32));
            textField1.setBounds(new Rectangle(185, 59, 152, 28));
            textField2.setBounds(new Rectangle(187, 143, 151, 30));
            button1.addActionListener(this);
            button2.addActionListener(this);
            button3.addActionListener(this);
            button4.addActionListener(this);
    //        button.addActionListener(this);
            textField.setEnabled(false);
            textField.setBounds(new Rectangle(189, 196, 150, 30));
            label3.setBounds(new Rectangle(81, 196, 10745, 26));
            button1.setBounds(new Rectangle(113, 111, 44, 23));
            button2.setBounds(new Rectangle(176, 112, 48, 23));
            button3.setBounds(new Rectangle(235, 112, 43, 23));
            button4.setBounds(new Rectangle(295, 110, 38, 24));
    //        button.setBounds(new Rectangle(154, 248, 129, 34));
            this.getContentPane().add(label1);
            this.getContentPane().add(label3);
            this.getContentPane().add(textField);
            this.getContentPane().add(label2);
            this.getContentPane().add(textField2);
            this.getContentPane().add(textField1);
            this.getContentPane().add(button1);
            this.getContentPane().add(button2);
            this.getContentPane().add(button3);
            this.getContentPane().add(button4);
    //        this.getContentPane().add(button);
            this.setTitle("简易计算器");
            this.setVisible(true);
            this.setSize(450, 350);
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            //获取数据
         String d1 = textField1.getText();
         String d2 = textField2.getText();
            String op = " " ;  //运算符号
            if (e.getActionCommand().equals("+")) {
                op = button1.getText();
            } else if (e.getActionCommand().equals("-")) {
                op = button2.getText();
            } else if (e.getActionCommand().equals("*")) {
                op = button3.getText();
            } else if (e.getActionCommand().equals("/")) {
                op = button4.getText();
            }
            //将数据转换为double类型进行计算
            double data1 = Double.parseDouble(d1);
            double data2 = Double.parseDouble(d2);
            Calculate calculate = new Calculate();
            double result = calculate.cal(data1, data2, op);
            textField.setText(String.valueOf(result));
        }
        public static void main(String[] args) {
            new test7();
        }
    }
    
    

    实验结果:
    在这里插入图片描述
    实验总结:

    e.getActionCommand().equals("文本")
    

    此函数可以去查看按钮是否被点击

    button(按钮定义名称).getText()
    

    此函数可以获取按钮上的文本

    还有等等十分好用的函数可以满足像 提取选项文本之类的方便函数,需要经常学习,这里我就等用到的时候在谈吧

    展开全文
  • java图形登录界面设计

    2020-10-24 23:23:10
    简单的java图形界面设计–登录界面 设计一个登录界面,用户名和密码正确时显示“登录成功”,错误时显示“登录失败”,如果三次输入错误,程序退出!!! package qq; import java.awt.GridLayout; import java.awt...
  • Java 图形化界面的实现 1.图形化界面实现所需的条件 图形化界面的窗体,图形化界面的面板 2.界面的窗体 2.1 什么是图形化界面的窗体 如图,黑色的外边框就类似于图形化界面的窗体,要实现图形化界面,窗体是不可...
  • JAVA图形界面之JTable

    千次阅读 2017-01-23 13:46:19
    JAVA图形界面之JTable
  • Java图形界面框架构建

    千次阅读 2018-06-11 15:36:02
    一、AWT、Swing Swing是在AWT基础上构建的新的...基本框架如下图:二、图形设计的流程 java图形界面程序包涵顶层容器、中间容器、组件。在设计这个图形界面的时候就是依次实现这三个的过程。 import java.awt....
  • JAVA 图形界面 入门 按钮

    千次阅读 2019-04-28 20:16:38
    JAVA 图形界面 入门 按钮 ~常用的包 import java.awt.*; import java.awt.event.*; import javax.swing.*; ~基础方法案例(一) public class ButtonDemo extends JFrame { public ButtonDemo() { JButton ...
  • java图形化界面的使用

    2019-01-14 19:31:07
    Java图形化界面的使用以及案例 关于java的图形化界面的使用的具体细节,又有哪些组件,容器,这么使用这里就不多说了,具体可以参考下面的链接博主写的很超详细 ... 大家可以按照下面这个图来理解java图形化界面设计 ...
  • Java图形界面知识点总结 1. java图形中常用的控件 常用窗体:JFrame、JDialog。窗体好比一块空白的画布,你可以任意添加按钮等组件到其中,也可以设置窗体的属性(大小、边界、排布等)。JFrame是一个主窗体,在一个...
  • Java 图形与动画编程实例.pdf

    热门讨论 2012-11-04 12:43:52
    Java图形与动画编程实例》将介绍Java中的图形图像编程,以大量生动的实例讲解了Java图形图像编程的方法和技巧。《Java图形与动画编程实例》共分十个章节,分别介绍了Java中基本的图像相关编程、Java3D的编程等。每...
  • JAVA图形界面总结1

    千次阅读 2017-05-22 12:41:58
    java图形中常用的控件. 3.如何给JPanel,JLabel,JButton中添加背景图片 4.列表选择框JComboBox,JList 5.给面板或者控件设置炫酷边框二.逐一介绍: 1. java图形中常用的控件 常用窗体:JFrame、JDialog。窗体...
  • java图形化实现文件上传

    热门讨论 2013-05-28 22:34:57
    利用java图形化界面和网络编程相结合实现的--文件上传。 运行步骤: (1)分别运行工程两个包中的两个.java文件(UploadClient.java和UploadServer.java)分别会弹出“上传客服端”和“上传服务器”两个窗口。 ...
  • Java图形界面编程模拟ATM自助取款系统

    万次阅读 多人点赞 2018-08-04 10:44:14
    本人学习Java时一直想做一个图形界面的程序,所以利用闲暇时间,做了一个Java图形界面编程模拟ATM自助取款系统,界面简洁漂亮,基本功能ATM功能实现。 程序初始时 考号:123456 密码:123456 金额:10000 ...
  • Java图形用户界面(一)

    2020-06-17 18:50:47
    什么是Java图形用户界面 图形用户界面是用户与程序交互的窗口,Java程序一般都需要设计、建立自己的用户界面并利用它接受用户的输入,向用户显示运行结果。 在Java语言中,为了方便图形用户界面的开发,设计了专门的...
  • java图形界面开发插件

    千次阅读 2017-11-23 12:52:32
    java图形界面开发工具  最近想用java开发一个仿pc版TIM的界面,发现自己编写代码来设置布局太麻烦了,就在网上找了一些java swing开发的插件 这是网址...
  • @数据库课程设计—简易网上银行管理系统-java图形用户界面 所使用数据库版本—mysql5.7 所使用java编译器—idea2019 效果实现图: 登录界面 功能界面: 注册界面: 管理员界面: 数据库表设计: 函数图: ...
  • ,,,,,,![图片](https://img-ask.csdn.net/upload/201704/12/1491981504_195529.jpg)
  • java图形

    千次阅读 2018-05-22 17:33:34
    3.1 跨平台三维图形开发工具包Java 3D官方主页:https://java3d.dev.java.net/Java 3D严格遵循“建模-绘制”泛型。场景图(scene graph)的 抽象模型被用来组织和维护虚拟场景中的可是对象及其行为。场景图包含了...
  • Java图形用户界面设计

    千次阅读 多人点赞 2014-11-28 20:23:26
    但是,同样是从论坛中,看到多数人提到 Java 就以为是网络开发——不是这样的,Java 也可以开发应用程序,而且可以开发出漂亮的图形用户界面的应用程序,也就是 Windows/XWindow 应用程序。因此,我写下这篇文章,...
  • 史上最扯Java图形绘制(J2SE)之一JAVA动画效果
  • Java图形界面事件监听处理

    千次阅读 2018-06-07 18:37:51
    Java图形界面事件监听处理共四种方法:1.自身类实现ActionListener接口,作为事件监听器(适合初学者,事件多时效率低)2。通过匿名类处理3.通过内部类处理4.通过外部类处理下面一一介绍1.自身类实现ActionListener...
  • Eclipse JAVA 图形界面插件及用法

    热门讨论 2011-07-12 09:56:15
    Eclipse JAVA 图形界面插件及用法 安装方法: 直接将plugins下的所有文件copy到MyEclipse安装目录下的eclipse文件夹下的plugins文件夹内
  • JAVA图形界面设计

    万次阅读 多人点赞 2017-08-23 21:12:40
    图形界面设计1 Java Swing 概述图形化界面(Graphics User Interface,GUI)是指采用图形方式显示的计算机操作用户界面。通过图形化界面,用户和程序之间可以方便地进行交互。Java的抽象窗口工具包(Abstract Window...
  • # 这是我最近做的关于java图形界面组件的小练习,主要功能是实现文件复制并显示进度。代码没有报错,运行也无异常,但是在程序运行过程中,进度条没有随着复制进度的增长而增长,一直显示为0%,只有复制完毕才会显示...
  • java图形界面编程换皮肤

    千次阅读 2018-09-05 22:36:27
    总所周知,java图形界面效果不是特别理想,于是在网上找了一些非常好看的皮肤 皮肤地址:皮肤地址 使用 下载了一款名为weblaf的皮肤,使用也很简单,导入jar包后,在main方法中,JFrame定义之前调用install();...
  • Java图形界面

    千次阅读 多人点赞 2017-10-30 20:10:57
    java 有一个强大的的API(Application Programming Interface应用程序编程接口))类,利用这些API类我们可以完成许多功能,今天我们要做的是图形界面的制作。 图形界面要用什么来实现呢?先介绍Swing组件,它的特点...

空空如也

1 2 3 4 5 ... 20
收藏数 23,735
精华内容 9,494
关键字:

java 图形

java 订阅