java 嵌入面板JInternalFrame的基本使用和数据的实时更新,及table数据模型的应用

public class UserQueryBookView extends JInternalFrame{

	/**
	 * 版本号
	 */
	private static final long serialVersionUID = 1L;
	
	//可滚动的面板
	private JScrollPane panel_table;
	//父面板
	private JPanel panel_parent;
	//按钮模块
	private JPanel panel_buttons;
	
	//查询表
	private JTable table;
	private JLabel lb_type;
	private JComboBox<String> cb_type;
	private JButton btn_search;
	private JButton btn_borrow;
	private JButton btn_exit;
	
	
	//建立属性依赖的
		private BookBiz bookBiz=null;
		private UsersBiz usersBiz=null;
		//保存用户信息的属性
		private Users user;
		//用户临时存放图书编号
		private int book_id;
		
		/*初始化块*/
		 {
			this.usersBiz=new UsersBizImpl();
			this.bookBiz=new BookBizImpl();
			init();//一定要调用初始化方法,否则一推空指针
		}
		
		public UserQueryBookView(Users user)
		{
			this.user=user;
		}
		
		public UserQueryBookView() {
			
		}
	
	
	/*初始化方法*/
	private void init() {
		table=new JTable();//这个地方实例化,供下面的panel_table调用
		panel_parent=new JPanel(new BorderLayout());
		panel_table=new JScrollPane(table);
		//设置面板的大小和边框
		panel_table.setBorder(BorderFactory.createTitledBorder
				(BorderFactory.createRaisedBevelBorder(), "图书信息列表"));
		
		//GridLayout类是一个布局管理器
		panel_buttons=new JPanel(new GridLayout(7,1,0,30));
		panel_buttons.setBorder(BorderFactory.createTitledBorder
				(BorderFactory.createRaisedBevelBorder(),"查询条件"));
		
		
		lb_type=new JLabel("查询类型:");
		//设置下拉框,用数组添加数据
		cb_type=new JComboBox<String>(new String[] {"查询全部图书",
				"查询热门图书","查询可借图书","查询不可借图书"});
		btn_search=new JButton("查询");
		btn_borrow=new JButton("借书");
		btn_exit=new JButton("退出窗口");
		
		//给按钮注册监听器
		registerActionListener();
		
		//拼装
		panel_parent.add(panel_table);
		//panel_table.add(table);
		
		panel_buttons.add(lb_type);
		panel_buttons.add(cb_type);
		panel_buttons.add(btn_search);
		panel_buttons.add(btn_borrow);
		panel_buttons.add(new JLabel());
		panel_buttons.add(new JLabel());
		panel_buttons.add(btn_exit);
		
		//面板的添加位置
		this.add(panel_table,BorderLayout.CENTER);
		this.add(panel_buttons,BorderLayout.EAST);
		
		//设置本窗体先关属性
		this.setTitle("图书信息查询界面");
		this.setIconifiable(true);
		this.setClosable(true);//关闭窗口
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setSize(500, 500);
		this.setVisible(true);
		
	}
	
	/*定义一个显示图书数据的数据模型*/
	private class BookDateModel implements TableModel {

		//显示什么数据
		private List<Book> books_list=null;
		
		//数据的set方法用于存入数据
		public void setBooks_list(List<Book> books_list)
		{
			this.books_list=books_list;
		}
		

		/** 告诉表格控件,每一列对应的数据类型,统一字符串*/
		@Override
		public Class<?> getColumnClass(int columnIndex) {
			//这个地方是String类型的
			return String.class;
		}

		
		/**获取有多少列,一般是看数据库的字段多少个*/
		@Override 
		public int getColumnCount() {
			//因为book对象有四个属性,所以写死,显示四列
			return 4;
		}

		/*告诉表格控件,需要显示多少行*/
		@Override //select book_id,book_name,book_count,status from book,获取列名的方法
		public String getColumnName(int columnIndex) {
			System.out.println("columnIndex:"+columnIndex);
			if(columnIndex==0)
			{
				return "图书编号";
			}else if(columnIndex==1)
			{
				return "图书名称";
			}else if(columnIndex==2)
			{
				return "借阅次数";
			}else if(columnIndex==3)
			{
				return "是否可借";
			}else
			{
				return "出错";
			}
			
		}

		/*告诉表控件,显示多少列,有上面的数据库得到,通过构造方法*/
		@Override
		public int getRowCount() {
			
			return books_list.size();
		}

		/**
		 * 根据行号,列好获取值
		 */
		@Override
		public Object getValueAt(int rowIndex, int columnIndex) {
			//System.out.println("rowIndex:"+rowIndex+",columnIndex:"+columnIndex);
			Book book=books_list.get(rowIndex);
			if(columnIndex==0)
			{
				return book.getBook_id();
			}else if(columnIndex==1)
			{
				return book.getBook_name();
			}else if(columnIndex==2)
			{
				return book.getBook_count();
			}else if(columnIndex==3)
			{
				return book.getStatus()==1?"可借":"不可借";
			}else
			{
				return "出错";
			}
			
		}


		@Override
		public void addTableModelListener(TableModelListener l) {
			// TODO Auto-generated method stub
			
		}


		@Override
		public boolean isCellEditable(int rowIndex, int columnIndex) {
			// TODO Auto-generated method stub
			return false;
		}


		@Override
		public void removeTableModelListener(TableModelListener l) {
			// TODO Auto-generated method stub
			
		}


		@Override
		public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
			// TODO Auto-generated method stub
			
		}


	}
	
	/**
	 * 表格刷新方法
	 */
	private void refreshTable(List<Book> books)
	{
		//为什么要写这个刷新的方法呢?
		//因为表格控件的数据会经常变化,所以定义一个刷新表格的方法
		BookDateModel dm=new BookDateModel();
		//给数据集合赋值,不然没有数据可以显示
		dm.setBooks_list(books);
		//现在把模型(含有数据的模型)交给Table的控件
		table.setModel(dm);
	}
	
	
	/**查询按钮的封装方法*/
	public void tableRegister() {
		int index=cb_type.getSelectedIndex();//获取下拉框选项的索引,从0开始
		List<Book> books=null;
		//2.谁帮我们查   bookBiz
		if(index==0)
		{
			//查询全部图书信息
			books=bookBiz.queryAll();
		}
		if(index==1)
		{
			//查询热门图书信息
			books=bookBiz.queryHotBooks();
		}
		if(index==2)
		{
			//查询可借图书信息
			books=bookBiz.queryCanBorrowBooks();
		}
		if(index==3)
		{
			//查询不可借图书信息
			books=bookBiz.queryNotCanBorrowBooks();
		}
		
		//这时候调用刷新方法,就是刷新表格控件,实现实时更新
		refreshTable(books);
	}

	
	/**给所有按钮注册监听器*/
	private void registerActionListener() {
		
		//给查询按钮注册监听器
		btn_search.addActionListener(new ActionListener() {

			//重写方法 应用执行 e是动作事件
			@Override
			public void actionPerformed(ActionEvent e) {
				//我们希望在table控件中显示我们查询到的数据
				//1.我们查神什么 2.谁帮我们查 3.差了之后交给谁 4.怎么显示?
				
				//1.我们查什么?
				
				 tableRegister();
			}
			
		});
		
		//给table控件注册监听器
		table.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e)
			{
				//获取用户选中图书的编号
				int row_num=table.getSelectedRow();
				//book_id是一个全局变量,用来临时存储数值
				book_id=(int) table.getValueAt(row_num, 0);
				System.out.println("book_id"+book_id);
				//我们可以去借书
			}
		});
		
		//给借书按钮注册监听器
		btn_borrow.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("借书按钮book_id:"+book_id);
				//这个地方获取不到getUser_id的值????? 问题解决:上一个页面必须传一个users对象类型过来
				System.out.println("借书按钮user.getUser_id:"+user.getUser_id());
				//判断书是否可借
				if(book_id==0)
				{
					JOptionPane.showMessageDialog(UserQueryBookView.this,"请你选择要借的书");
					return;
				}
				//1.获取用户选中的图书
				//2.调用biz中的方法完成借阅功能
				boolean tmp=usersBiz.borrowBook(user.getUser_id(),book_id);
				if(tmp)
				{
					JOptionPane.showMessageDialog(UserQueryBookView.this,"借书成功");
					tableRegister();

				}else
				{
					JOptionPane.showMessageDialog(UserQueryBookView.this, "借书不成功");
				}
						
			
			}
		});
		
		btn_exit.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				//简单粗暴的直接退出程序 ,(不建议用)  注意点:任何非0的退出,都是非正常退出 例如 System.exit(1);
				//System.exit(0);
				
				//这种方式比较适合嵌入式窗口的退出     setVisible是设置可见或是不可见
				UserQueryBookView.this.setVisible(false);
			}
			
		});
			
		
	}
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值