题目:

java实验10(图1)

java实验10(图2)

题解:

import java.awt.Color;
import java.awt.Container;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import java.sql.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableRowSorter;

import com.sun.corba.se.pept.transport.Connection;


//窗口类
//****************************************************************************************************************
class Windos extends JFrame{
	private Vector<JButton> Button = new Vector<JButton>();  //定义存储按钮
	private Vector<JLabel> Lable = new Vector<JLabel>();  //提示
	private Vector<JTextArea> Text = new Vector<JTextArea>();  //输入
	private JTable table;  //表格
	private Vector<Vector<String>> tableValueV;
	private JFrame jf;
	private DefaultTableModel Model;//表单模型对象
	public Windos (){
		jf = new JFrame("表格模型"); // 实例化一个JFrame对象
		jf.setLayout(null);
		Container container = jf.getContentPane(); // 获取一个容器
		jf.setVisible(true); // 使窗体可视
		container.setBackground(Color.orange);
		jf.setBounds(650,300,700, 450); // 设置窗体大小
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		jf.setResizable(false);  //设置大小不可改变
		//setBounds(100,100,400,300);
		//设置窗口关闭
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//定义表格列明
		Vector<String> columnNameV = new Vector<String>();
		columnNameV.add("学号");
		columnNameV.add("姓名");
		columnNameV.add("成绩");
		
		//定义表格数据
		tableValueV = new Vector<Vector<String>>();
	    
	    //创建指定表格列名和表格数据的表格       表单模型对象
	    Model = new DefaultTableModel(tableValueV,columnNameV);
	    table = new JTable(Model);
	    //将表格添加到边界布局的中间
	    container.add(table);
	    table.setBounds(10, 80, 660,260);
	    JTableHeader tableHeader = table.getTableHeader();
	    //设置行高和大小
	    table.setBackground(Color.white);
	    table.setRowHeight(25);
	    tableHeader.setBackground(Color.white);
	    //将表格头添加到边界布局上方
	    container.add(tableHeader);
	    tableHeader.setBounds(10,50,660,30);
	    //表单模型进行排序
	    table.setRowSorter(new TableRowSorter<DefaultTableModel>(Model));
	    
	    
	    //定义按钮   1.重载数据库    2.存入数据库   3.删除所有条目   4.添加
	    Button.add(new JButton("重载数据库"));
	    Button.add(new JButton("存入数据库"));
	    Button.add(new JButton("删除所选条目"));
	    Button.add(new JButton("添加"));

	    //定义提示lable
	    Lable.add(new JLabel("学号:"));
	    Lable.add(new JLabel("姓名:"));
	    Lable.add(new JLabel("成绩:"));
	    
	    //定义输入框 1.学号 2.姓名 3.成绩
	    Text.add(new JTextArea(""));
	    Text.add(new JTextArea(""));
	    Text.add(new JTextArea(""));
	    
	    //循环加入让容器
	    for( int i =0; i < Button.size();i++){
	    	container.add(Button.elementAt(i));
	    	Button.elementAt(i).setBackground(Color.cyan);
	    }
	    for( int i =0; i < Lable.size();i++){
	    	container.add(Lable.elementAt(i));
	    	//Lable.elementAt(i).setBackground(Color.orange);
	    }
	    for( int i =0; i < Text.size();i++){
	    	container.add(Text.elementAt(i));
	    	//Lable.elementAt(i).setBackground(Color.orange);
	    }
	    //给按钮布局
	    Button.elementAt(0).setBounds(30,10,180,33);
	    Button.elementAt(1).setBounds(255,10,180,33);
	    Button.elementAt(2).setBounds(480,10,180,33);
	    Button.elementAt(3).setBounds(550,360,100,33);
	    
	    Lable.elementAt(0).setBounds(30, 360, 65, 33);
	    Lable.elementAt(1).setBounds(200, 360, 65, 33);
	    Lable.elementAt(2).setBounds(380, 360, 65, 33);
	    
	    Text.elementAt(0).setBounds(65, 366, 100, 19);
	    Text.elementAt(1).setBounds(235, 366, 100, 19);
	    Text.elementAt(2).setBounds(415, 366, 50, 19);
	}
	
	//传出数据
	public Vector<JButton> button() {
		return Button;
	}
	public Vector<JLabel> lable(){
		return Lable;
	}
	public Vector<JTextArea> text(){
		return Text;
	}
	public JTable table(){
		return table;
	}
	public Vector<Vector<String>> tables(){
		return tableValueV;
	}
	public DefaultTableModel TableModel(){
		return Model;
	}
	
	//传出窗口
	public JFrame JF(){
		return jf;
	}
}
//****************************************************************************************************************


//数据库创建和操作类
//******************************************************************************************************************
class SQL{
	private java.sql.Connection con;
	private Statement sql;
	private ResultSet res;
	//数据返回
	public void Con(java.sql.Connection con){
		this.con = con;
	}
	//连接数据库
	public java.sql.Connection getConnection(){
		try {
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("数据库驱动加载成功!");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("数据库驱动加载失败!");
		}
		try {
			con = DriverManager.getConnection("jdbc:mysql:"+"//localhost:3306/test","root","123456");
			System.out.println("数据库加载成功!");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("数据库加载失败!");
			System.out.println(e.getMessage());
		}
		return con;
	}
	
	//查询数据库
	public Vector<Vector<String>> Inquire(java.sql.Connection con,Vector<Vector<String>> tableValueV){
		Vector<Vector<String>> table = new Vector<Vector<String>>();
		try {
			sql = con.createStatement();  //实例化
			res = sql.executeQuery("select * from student");
			int i = 0;
			while(res.next()){    //如果不是最后一条,进入循环
				//System.out.println(res.getString("xuehao"));
				//System.out.println(res.getString("xingming"));
				//System.out.println(res.getInt("score"));
				String ID = res.getString("xuehao");
				String Name = res.getString("xingming");
				String Score = res.getInt("score")+"";
				Vector<String> rowV = new Vector<String>();
				rowV.add(ID);
		    	rowV.add(Name);
		    	rowV.add(Score);
		    	tableValueV.add(rowV);
				i++;
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("查询数据库失败!");
		}
	    return table;
	}
	
	//清除数据库表student
	public void Delete(){
		try {
			sql = con.createStatement();  //实例化
		    sql.executeUpdate("delete from student;");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("清除数据库失败!"+e.getMessage());
		}
	}
	
	//重新写入数据库表student
	public void Write(Vector<Vector<String>> table){
		try {
			sql = con.createStatement();  //实例化
			for( int i = 0;i < table.size(); i ++){
				String ID = "'"+table.elementAt(i).elementAt(0)+"'";
				String Name = "'"+table.elementAt(i).elementAt(1)+"'";
				String ScoreS = table.elementAt(i).elementAt(2);
				int ScoreI =Integer.parseInt(ScoreS);
				sql.executeUpdate("insert into student "+"values(null,"+ID+","+Name+","+ScoreI+");"); 
				//System.out.println(sql);
			}
		} catch (Exception e) {
			// TODO: handle exception
			
		}
	}
}
//******************************************************************************************************************

//主类
//******************************************************************************************************************
public class lixiao10 {

	/**
	 * @param args
	 */
	//添加记录方法
	private static void add(Vector<Vector<String>> tableValueV,Windos win){
		Vector<JTextArea> text = win.text();
		String ID = text.elementAt(0).getText();
		String NAME = text.elementAt(1).getText();
		String SCORE = text.elementAt(2).getText();
		if(ID.length()!=0 && NAME.length()!=0 && SCORE.length()!=0){
			Vector<String> rowV = new Vector<String>();
	    	rowV.add(ID);
	    	rowV.add(NAME);
	    	rowV.add(SCORE);
	    	tableValueV.add(rowV);
	    	for( int i = 0; i < text.size(); i ++){
	    		text.elementAt(i).setText("");
	    	}
		}else{
			JOptionPane.showMessageDialog(null, "必须每条信息都有合法的值!");
		}
	}
	
	
	
	
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		final Windos win = new Windos();
		//拿出数据   但是在初始化窗口时,会延迟 
		final JFrame jf = win.JF();
		final Vector<JButton> Button = win.button();
		final Vector<Vector<String>> tableValueV=win.tables();
		//连接数据库
		final SQL seleSql = new SQL();
		final java.sql.Connection con = seleSql.getConnection();
		seleSql.Inquire(con,tableValueV);
		//**************************************************************************************
		//for( int i = 0; i < 6; i ++){
	    //	Vector<String> rowV = new Vector<String>();
	    //	rowV.add("00"+i);
	    //	rowV.add("李四");
	    //	rowV.add("90");
	    //	tableValueV.add(rowV);
	    //}
		//**************************************************************************************
		//添加                              添加点击事件
		Button.elementAt(3).addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				add(tableValueV,win);
				jf.repaint(); 
		}});
		//**************************************************************************************
		//重载数据库                             添加点击事件
		Button.elementAt(0).addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				//System.out.println(tableValueV);
				for(int i = tableValueV.size()-1; i >= 0; i --) {
					//System.out.println(tableValueV.elementAt(i)+"sss");
					tableValueV.remove(i);
				}
				seleSql.Inquire(con,tableValueV);
				jf.repaint(); 
		}});
		//**************************************************************************************
		//**************************************************************************************
		//存入数据库                           添加点击事件
		Button.elementAt(1).addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				if(tableValueV.size() <= 0){
					JOptionPane.showMessageDialog(null, "需要存入的数据是空的!");
					return;
				}
				seleSql.Delete();
				seleSql.Write(tableValueV);
				jf.repaint(); 
		}});
		//**************************************************************************************
		//**************************************************************************************
		//删除所选                              添加点击事件
		Button.elementAt(2).addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				//获取被选中的行索引
				int selectRow = win.table().getSelectedRow();
				if(selectRow >= win.table().getRowCount() || selectRow <0) {
					System.out.println("未选择或者已经没有可以删除的行了!");
					return;
				}
				try {
					Object ID = win.TableModel().getValueAt(selectRow, 0);
					Object Name = win.TableModel().getValueAt(selectRow, 1);
					Object Score = win.TableModel().getValueAt(selectRow, 2);
					
					Vector<String> SeleValue = new Vector<String>();
					SeleValue.add(ID.toString());
					SeleValue.add(Name.toString());
					SeleValue.add(Score.toString());
					//删除所选条目
					tableValueV.remove(selectRow);
				} catch (Exception e) {
					
					System.out.println(selectRow);
					// TODO: handle exception
				}
					
				
				jf.repaint(); 
				
		}});
		//**************************************************************************************
		//刷新窗口
		jf.repaint(); 
	}

}
//******************************************************************************************************************

思考:

        这代码还是比较粗糙,后面会更新比较好的代码;其次呢,函数的简洁性还是不怎么好;后面还会更新mysql对于zip包的安装和使用;还有一个问题是,这个窗口并不会自己刷新,意思是,在创建窗口时,数据并没有写入窗口中,所以,大概有三种解决办法:

        1.在窗口创建前赋值数据,但是在数据更新时,我们并不能再次显示新的数据。所以这个并不是一个好的办法;

        2.写一个线程,不断刷新窗口;刷新窗口代码 window.repaint(); 这样的话会占用cpu时间片;

        3.在每次数据更新之后刷新页面,这样的话,在一般情况下是不会出错的。但是稳定性肯定没有方法2好;

         这个小问题也算是留下来的问题与思考。