Java+Swing+Mysql学生成绩管理系统(DAY 9)

Java+Swing+Mysql学生成绩管理系统(DAY 9)

问题引入

  1. 主界面需要哪些组件,如何布局各个组件
  2. 如何响应LoginView界面的登录按钮,跳转到下一个页面(主界面)
    (暂时不绑定数据库,不实现用户密码登录,登录按钮无需输入直接响应跳转到主界面)
  3. 成绩页面的大小如何设置,布满整个电脑屏幕且不覆盖任务栏

界面效果

Java+Swing+Mysql学生成绩管理系统(DAY 9)_第1张图片
Java+Swing+Mysql学生成绩管理系统(DAY 9)_第2张图片

逻辑关系

Java+Swing+Mysql学生成绩管理系统(DAY 9)_第3张图片

LoginView

package view;

import handler.LoginHandler;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;

public class LoginView extends JFrame {

    JLabel titleNameLabel=new JLabel("学生成绩管理系统",JLabel.CENTER);

    SpringLayout spLayout=new SpringLayout();
    JPanel centerPanel=new JPanel(spLayout);

    JLabel userNameLabel=new JLabel("用户名:");
    JLabel userPwdLabel=new JLabel("登录密码:");

    JTextField nameTxd=new JTextField();
    JPasswordField pwdFiled=new  JPasswordField();

    JButton loginBtn=new JButton("登录");
    JButton resetBtn=new JButton("重置");

    //声明桌面系统托盘SystemTray
    SystemTray systemTray;
    TrayIcon trayIcon;
    LoginHandler loginHandler;

    public LoginView(){

        super("学生成绩管理系统");

        loginHandler=new LoginHandler(this);
        //获取内容面板
        Container contentPane =getContentPane();
        //设置标题的字体,格式,大小
        titleNameLabel.setFont(new Font("华文行楷",Font.PLAIN,40));
        titleNameLabel.setPreferredSize(new Dimension(0,80));
        //设置中间各个组件的字体,大小,格式
        Font centerFont=new Font("华文行楷",Font.PLAIN,20);
        userNameLabel.setFont(centerFont);
        nameTxd.setPreferredSize(new Dimension(200,30));
        userPwdLabel.setFont(centerFont);
        pwdFiled.setPreferredSize(new Dimension(200,30));
        loginBtn.setFont(centerFont);
        resetBtn.setFont(centerFont);

        contentPane.setBackground(Color.pink);

        //把组件加入到面板上
        centerPanel.add(userNameLabel);
        centerPanel.add(userPwdLabel);
        centerPanel.add(nameTxd);
        centerPanel.add(pwdFiled);
        centerPanel.add(loginBtn);
        centerPanel.add(resetBtn);

        loginBtn.addActionListener(loginHandler);//增加登录按键的事件监听
        loginBtn.addKeyListener(loginHandler);//增加键盘按键监听事件
        resetBtn.addActionListener(loginHandler);//增加重置按键的事件监听

        contentPane.add(titleNameLabel,BorderLayout.NORTH);
        contentPane.add(centerPanel,BorderLayout.CENTER);

        //设置中间组件的位置,弹簧布局
        layoutCenter();

        //判断当前系统是否支持系统托盘
        if(SystemTray.isSupported()){
            systemTray=SystemTray.getSystemTray();//初始化系统托盘
            URL imgUrl = LoginView.class.getClassLoader().getResource("LoginView.jpg");
            trayIcon=new TrayIcon(new ImageIcon(imgUrl).getImage());//初始化托盘图标
            trayIcon.setImageAutoSize(true);//托盘图标可以自动缩放大小
            try {
                systemTray.add(trayIcon);//将托盘图标加入到系统托盘组件中,并抛出异常
            } catch (AWTException e) {
                e.printStackTrace();
            }
            //创建一个事件响应,最小化时销毁资源
            this.addWindowListener(new WindowAdapter() {
                @Override
                public void windowIconified(WindowEvent e) {
                    LoginView.this.dispose();
                }
            });

            //托盘事件监听(鼠标单击一次托盘,窗口将会正常显示)
            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    int clickCont=e.getClickCount();
                    if(clickCont==1){
                        LoginView.this.setExtendedState(JFrame.NORMAL);
                    }
                    LoginView.this.setVisible(true);
                }
            });
        }
        //设置loginBtn为默认按钮,按下回车键时默认响应loginBtn的键盘响应
        getRootPane().setDefaultButton(loginBtn);

        //设置窗口图片
        URL imgUrl=LoginView.class.getClassLoader().getResource("LoginView.jpg");
        setIconImage(new ImageIcon(imgUrl).getImage());
        //设置窗口基本参数
        setSize(600,400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    }

    private void layoutCenter() {
        //获取组件的宽度Spring.width(组件名)用户名和用户名文本框组件
        Spring titleLabelWidth=Spring.width(userNameLabel);
        Spring titleTextWidth=Spring.width(nameTxd);
        Spring spaceWidth=Spring.constant(20);//userNameLabel和nameTxd的间距
        Spring totalWidth=Spring.sum(Spring.sum(titleLabelWidth,titleTextWidth),spaceWidth);
        int offSetX=totalWidth.getValue()/2;

         /*
        SpringLayout:布局管理器
        SpringLayout.Constraints:使用弹簧布局的容器里面的组件的布局约束,每个组件对应一个
        Spring:能够进行四则运算的整数
         */
        /*
        窗口相当于一个左顶角为原点的第四象限的坐标轴

         */
        //1.设置好用户名标签的位置(约束)
        SpringLayout.Constraints titleLabelCon=spLayout.getConstraints(userNameLabel);
        //用户名标签userNameLabel的西边参考centerPanel组件水平中心点方向左偏移offSetX的距离
        spLayout.putConstraint(SpringLayout.WEST,userNameLabel,-offSetX,SpringLayout.HORIZONTAL_CENTER,centerPanel);
        //设置用户名标签的垂直标签
        spLayout.putConstraint(SpringLayout.NORTH,userNameLabel,20,SpringLayout.NORTH,centerPanel);
        //or使用setY()设置垂直偏移量
        // titleLabelCon.setY(Spring.constant(50));//垂直偏移量

        //2.设置用户名文本框nameTxd的位置(约束)
        spLayout.putConstraint(SpringLayout.WEST,nameTxd,20,SpringLayout.EAST,userNameLabel);
        spLayout.putConstraint(SpringLayout.NORTH,nameTxd,0,SpringLayout.NORTH,userNameLabel);

        //3.设置密码标签userPwdLabel的位置
        spLayout.putConstraint(SpringLayout.NORTH,userPwdLabel,20,SpringLayout.SOUTH,userNameLabel);
        spLayout.putConstraint(SpringLayout.EAST,userPwdLabel,0,SpringLayout.EAST,userNameLabel);

        //4.设置密码文本框pwdFiled的位置(约束)
        spLayout.putConstraint(SpringLayout.WEST,pwdFiled,20,SpringLayout.EAST,userPwdLabel);
        spLayout.putConstraint(SpringLayout.NORTH,pwdFiled,0,SpringLayout.NORTH,userPwdLabel);

        //5.设置登录按钮loginBtn的位置
        spLayout.putConstraint(SpringLayout.EAST,loginBtn,-20,SpringLayout.HORIZONTAL_CENTER,centerPanel);
        spLayout.putConstraint(SpringLayout.NORTH,loginBtn,50,SpringLayout.SOUTH,pwdFiled);

        //6.设置重置按钮resetBtn的位置
        spLayout.putConstraint(SpringLayout.WEST,resetBtn,20,SpringLayout.HORIZONTAL_CENTER,centerPanel);
        spLayout.putConstraint(SpringLayout.NORTH,resetBtn,50,SpringLayout.SOUTH,pwdFiled);
    }

    public static void main(String[] args){
        new LoginView();
    }


    public JTextField getNameTxd() {
        return nameTxd;
    }

    public JPasswordField getPwdFiled() {
        return pwdFiled;
    }
}

LoginHandler

package handler;

import view.*;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class LoginHandler extends KeyAdapter implements ActionListener{

    private LoginView loginView;
    public LoginHandler(LoginView loginView){
        this.loginView=loginView;
    }


    @Override
    public void actionPerformed(ActionEvent e){
        JButton jButton=(JButton) e.getSource();
        String text=jButton.getText();
        if("重置".equals(text)){
            loginView.getNameTxd().setText("");//获取NameTxd上的用户名并置空
            loginView.getPwdFiled().setText("");//获取PwdFiled上的密码并置空
        }else if("登录".equals(text)){
            login();
        }
    }


    private void login() {
        String user=loginView.getNameTxd().getText();//获取NameTxd上的用户名
        char []chars=loginView.getPwdFiled().getPassword();//获取PwdFiled上的密码
        String pwd=new String(chars);//转为字符串型
        System.out.println(user+":"+pwd);
        //查询database,验证
        boolean flag=true;
        if(flag){
        	//如果登录成功在这里进入主界面并销毁登录界面
        	new MainView();
        	loginView.dispose();

        }else{
            JOptionPane.showMessageDialog(loginView,"用户名密码错误");
        }
    }

    @Override
    //键盘监听,按下回车键
    public void keyPressed(KeyEvent e) {
        if(KeyEvent.VK_ENTER==e.getKeyCode()) {
            login();
        }
    }

}

MainTable

package view;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.net.URL;
import java.util.Vector;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import ext.MainViewTable;
import ext.MainViewTableModel;
import util.DimensionUtil;

public class MainView extends JFrame{
	
	JPanel northPanel=new JPanel(new FlowLayout(FlowLayout.LEFT));//JPanel默认流布局,组件居左
	JButton addBtn=new JButton("增加");
	JButton updataBtn=new JButton("修改");
	JButton delBtn=new JButton("删除");
	JTextField searchTxt=new JTextField(15);
	JButton searchBtn=new JButton("查询");
	
	JPanel southPanel=new JPanel(new FlowLayout(FlowLayout.RIGHT));//组件居右
	JButton preBtn=new JButton("上一页");
	JButton nextBtn =new JButton("下一页");
	
	//创建一个MainViewTable对象
	MainViewTable mianViewTable=new MainViewTable();
	
	//构造方法
	public MainView() {
		
		super("主界面-学生成绩管理系统");
		Container contentPane=getContentPane();
		
		//放置北边的组件
		layoutNorth(contentPane);
		//放置中间的组件
		layoutCenter(contentPane);
		//放置南边的组件
		layoutSouth(contentPane);
		//基础设置
	    init();
	}

	private void layoutCenter(Container contentPane) {
		//暂时还没调用数据库,所以把主面板上内容写死,创建一个二维数组存放data
		Vector<Vector<Object>> data = new Vector<>();
        Vector<Object> rowVector1 = new Vector<>();
        rowVector1.addElement("1");
        rowVector1.addElement("张三");
        rowVector1.addElement("1");
        rowVector1.addElement("湖南");

        Vector<Object> rowVector2 = new Vector<>();
        rowVector2.addElement("2");
        rowVector2.addElement("李四");
        rowVector2.addElement("2");
        rowVector2.addElement("北京");

        Vector<Object> rowVector3 = new Vector<>();
        rowVector3.addElement("3");
        rowVector3.addElement("王五");
        rowVector3.addElement("3");
        rowVector3.addElement("上海");

        data.addElement(rowVector1);
        data.addElement(rowVector2);
        data.addElement(rowVector3);
        
        //自定义的MainViewTableModel
		MainViewTableModel mainViewTableModel=MainViewTableModel.assembleModel(data);
		//将Table与TableModel关联
		mianViewTable.setModel(mainViewTableModel);
		//设置渲染方式
		mianViewTable.renderRule();
		
		 JScrollPane jScrollPane = new JScrollPane(mianViewTable);
		 contentPane.add(jScrollPane,BorderLayout.CENTER);
	}



	private void layoutSouth(Container contentPane) {
		southPanel.add(preBtn);
		southPanel.add(nextBtn);
		contentPane.add(southPanel,BorderLayout.SOUTH);
	}


	
	private void layoutNorth(Container contentPane) {
		northPanel.add(addBtn);
		northPanel.add(updataBtn);
		northPanel.add(delBtn);
		northPanel.add(searchTxt);
		northPanel.add(searchBtn);
		contentPane.add(northPanel,BorderLayout.NORTH);
	}
	
	private void init() {
		//设置窗口图片
        URL imgUrl=LoginView.class.getClassLoader().getResource("LoginView.jpg");
        setIconImage(new ImageIcon(imgUrl).getImage());
        //设置窗口基本参数
        setBounds(DimensionUtil.getBounds());
        //设置窗体完全充满整个屏幕
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(true);
        setVisible(true);
	}


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
	}

}

MainViewTable

package ext;

import java.awt.Color;
import java.awt.Font;
import java.util.Vector;
	
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;



public class MainViewTable extends JTable{
	
	public MainViewTable() {
		//设置表头的属性(字体,颜色)
        JTableHeader tableHeader = getTableHeader();
        tableHeader.setFont(new Font(null, Font.BOLD, 16));
        tableHeader.setBackground(Color.pink);
        //设置表格体
        setFont(new Font(null, Font.PLAIN, 14));
        setBackground(Color.WHITE);
        setGridColor(Color.BLACK);//设置表格分割线为纯黑色
        setRowHeight(30);//设置行高
        //设置是否可以多行选择(默认就是多行选择)
        getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

	}
	
	
	
	public void renderRule() {
		//设置每一列的渲染方式
        Vector<String> columns=MainViewTableModel.getColumns();//获取每一列
        MainViewCellRender render =new MainViewCellRender();//设置渲染方式
        for(int i=0;i<columns.size();i++){
            TableColumn column=getColumn(columns.get(i));
            column.setCellRenderer(render);
            if(i==0){//设置第一列的宽度
                column.setPreferredWidth(30);
                column.setResizable(false);//设置第一列的宽度不可改变
            }
        }
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

MainViewCellRender

package ext;

import java.awt.Color;
import java.awt.Font;
import java.util.Vector;
	
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;



public class MainViewTable extends JTable{
	
	public MainViewTable() {
		//设置表头的属性(字体,颜色)
        JTableHeader tableHeader = getTableHeader();
        tableHeader.setFont(new Font(null, Font.BOLD, 16));
        tableHeader.setBackground(Color.pink);
        //设置表格体
        setFont(new Font(null, Font.PLAIN, 14));
        setBackground(Color.WHITE);
        setGridColor(Color.BLACK);//设置表格分割线为纯黑色
        setRowHeight(30);//设置行高
        //设置是否可以多行选择(默认就是多行选择)
        getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

	}
	
	
	
	public void renderRule() {
		//设置每一列的渲染方式
        Vector<String> columns=MainViewTableModel.getColumns();//获取每一列
        MainViewCellRender render =new MainViewCellRender();//设置渲染方式
        for(int i=0;i<columns.size();i++){
            TableColumn column=getColumn(columns.get(i));
            column.setCellRenderer(render);
            if(i==0){//设置第一列的宽度
                column.setPreferredWidth(30);
                column.setResizable(false);//设置第一列的宽度不可改变
            }
        }
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

MainViewTableModel

package ext;

import java.util.Vector;

import javax.swing.table.DefaultTableModel;


public class MainViewTableModel extends DefaultTableModel{
    //定义属性列(表头)
    static Vector<String> columns=new Vector<>();
    static{
        columns.addElement("编号");
        columns.addElement("姓名");
        columns.addElement("学号");
        columns.addElement("家乡");
    }
    //构造函数私有化防止外部重写对象
    private MainViewTableModel(){
        super(null,columns);//初始状态表格体为空,表头固定
    }

    private static MainViewTableModel mainViewTableModel=new MainViewTableModel();
    public static MainViewTableModel assembleModel(Vector<Vector<Object>> data){
    	mainViewTableModel.setDataVector(data,columns);
        return mainViewTableModel;
    }

    public static Vector<String> getColumns() {
        return columns;
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;//false不可编辑
    }
}

DimensionUtil

package util;

import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class DimensionUtil {

	public static Rectangle getBounds() {
		Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();
		//如果直接返回屏幕的大小return screenSize的话,页面会覆盖任务栏,并且页面左右会留缝隙
		
		//保证主界面不会覆盖电脑屏幕的任务栏
		Insets screenInset=Toolkit.getDefaultToolkit().
		getScreenInsets(new JFrame().getGraphicsConfiguration());
		
		Rectangle rectangle= new Rectangle(screenInset.left,screenInset.top,
				screenSize.width-screenInset.left-screenInset.right, 
				screenSize.height-screenInset.top-screenInset.bottom);
		return rectangle;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

你可能感兴趣的:(java图形化界面编程,java,mysql,开发语言)