sample30_10.java

来自「Java SE 6.0前27-31章示的示例代码,简单易学」· Java 代码 · 共 608 行 · 第 1/2 页

JAVA
608
字号
package wyf.jc;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.sql.*;
import java.util.*;
//自定义的输入数据库连接信息的对话框
class MyDialog extends JDialog implements ActionListener,ItemListener
{
	//创建驱动类全称类名字符串数组
	String[] driver={"sun.jdbc.odbc.JdbcOdbcDriver",
					"org.gjt.mm.mysql.Driver",
					"oracle.jdbc.driver.OracleDriver",
					"org.apache.derby.jdbc.EmbeddedDriver",""};
	//创建选择数据库类型下拉列表框中显示的字符串数组
	String[] dbname={"JDBC-ODBC桥","MySQL数据库",
	                 "Oracle数据库","Derby数据库","其他数据库"};
	//创建连接前缀字符串数组
	String[] urlhead={"jdbc:odbc:","jdbc:mysql:","jdbc:oracle:thin:@","jdbc:derby:",""};	
	//创建下拉列表框
	JComboBox jcb=new JComboBox(dbname);
	//创建标签数组
	JLabel[] jl={new JLabel("选择数据库"),new JLabel("驱动类类名"),
	             new JLabel("数据库URL"),new JLabel("用户名"),new JLabel("密码")};
	//创建文本框数组
	JTextField[] jtf={new JTextField(),new JTextField(),
	                  new JTextField(),new JPasswordField()};
	JButton[] jb={new JButton("连接"),new JButton("取消")};
	//声明一个主窗体的引用
	Sample30_10 father;
	public MyDialog(Sample30_10 f)
	{ 
		//调用父类构造器设置该对话框的所有者以及模式
		super(f,true);
		//初始化主窗体的引用
		this.father=f;
		//设置对话框的布局管理器
		this.setLayout(null);
		//设置下拉列表的大小位置并将其添加进窗体
		jcb.setBounds(95,10,130,26);		
		this.add(jcb);
		//为下拉列表框注册监听器
		jcb.addItemListener(this);
		//循环对文本框以及标签进行设置
		for(int i=0;i<jl.length-1;i++)
		{
			//设置标签的大小位置并将其添加进窗体
			jl[i].setBounds(20,10+i*40,80,26);
			this.add(jl[i]);
			//设置文本矿的大小位置并将其添加进窗体
			jtf[i].setBounds(95+(i==3?1:0)*150,50+(i>2?2:i)*40,250-(i/2)*150,26);			
			this.add(jtf[i]);
			//为文本框注册事件监听器
			jtf[i].addActionListener(this);
		}
		//初始化驱动类类名与连接字符串文本框内容
		jtf[0].setText(driver[0]);
		jtf[1].setText(urlhead[0]);
		//设置密码标签
		jl[4].setBounds(210,130,80,26);
		this.add(jl[4]);
		//循环对按钮进行设置
		for(int i=0;i<jb.length;i++)
		{
			//设置按扭的大小位置并将其添加进窗体
			jb[i].setBounds(100+i*100,170,80,26);
			this.add(jb[i]);
			//为其注册监听器
			jb[i].addActionListener(this);			
		}
		//为对话框注册窗体事件监听器
		this.addWindowListener(
			new WindowAdapter()
			{
				//重写windowClosing方法
				public void windowClosing(WindowEvent e)
				{//退出程序
					System.exit(0);
				}
			});
		//设置该对话框的大小位置、标题、可伸缩性以及可见性
		this.setBounds(100,100,400,240);
		this.setTitle("请填写数据库连接信息");
		this.setResizable(false);
		this.setVisible(true);
	}
	//实现ItemListener监听接口中的方法
	public void itemStateChanged(ItemEvent ie)
	{
		//根据当前选择的数据库类型自动填充驱动类全称类名以及连接字符串前缀
		int index=jcb.getSelectedIndex();
		jtf[0].setText(driver[index]);
		jtf[1].setText(urlhead[index]);
	}
	//实现ActionListener监听接口中的方法
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource()==jb[0]||e.getSource()==jtf[3])
		{//点击打开按扭或者密码框中按下回车后执行的动作
			this.referFather();
		}
		else if(e.getSource()==jb[1])
		{//点击取消按扭后执行的动作
			System.exit(0);
		}
		else
		{
			for(int i=0;i<3;i++)
			{//在驱动类全称类名、连接字符串前缀以及用户名文本框中按下回车执行的动作
				if(e.getSource()==jtf[i])
				{
					jtf[i+1].requestFocus();
				}
			}			
		}
	}
	//自定义的将用户选择的数据库连接信息传到主窗体的方法
	public void referFather()
	{
		//测试必填文本框中的内容是否为空
		if(jtf[0].getText()!=null&&!jtf[0].getText().trim().equals("")&&
			jtf[1].getText()!=null&&!jtf[1].getText().trim().equals(""))
		{//将数据库连接信息传到主窗体
			father.setUNP(jtf[0].getText().trim(),jtf[1].getText().trim(),
					jtf[2].getText().trim(),jtf[3].getText().trim());
			this.dispose();//关闭对话框	
		}
		else
		{//若URL文本框中的内容为空则弹出警告对话框
			JOptionPane.showMessageDialog(this,
				"请完整输入数据库的连接信息!!!","错误",JOptionPane.WARNING_MESSAGE);
		}
	}
}
//自定义的记录树节点信息的类
class TreeNodeValue
{
	//记录节点是否被展开过的成员变量
	private boolean open=false;
	//记录节点位于第几层,-1代表还没设置
	private int floor=-1;
	//记录节点的名称
	private String nodeName;
	public TreeNodeValue(int f,String name)
	{//初始化节点层与名称信息
		this.floor=f;
		this.nodeName=name;
	}
	//获取节点层次的方法
	public int getFloor()
	{
		return this.floor;
	}
	//重写的toString方法,将返回节点的名称
	public String toString()
	{
		return this.nodeName;
	}
	//设置节点是否被展开过状态的方法
	public void setOpen(boolean b)
	{
		this.open=b;
	}
	//获取节点是否被展开过状态的方法
	public boolean isOpen()
	{
		return this.open;
	}
}
//自定义的树节点绘制器
class MyTreeCellRenderer extends DefaultTreeCellRenderer
{
	//重写父类中的方法
	public Component getTreeCellRendererComponent (JTree tree,final Object value,
	final boolean selected, boolean expanded,boolean leaf,int row,boolean hasFocus)
	{		
		//获得节点对象
		DefaultMutableTreeNode temp=(DefaultMutableTreeNode)value;
		//从节点对象中取出值对象
		TreeNodeValue tnv=(TreeNodeValue)temp.getUserObject();
		//获得节点的文字信息字符串
		final String msg=tnv.toString();
		//创建一个标签
		JLabel jl=new JLabel()
		{
			{
				//定义标签的水平、垂直对齐方式
				this.setHorizontalAlignment(JLabel.LEFT);
				this.setVerticalAlignment(JLabel.CENTER);				
			}
			public void paint(Graphics g)
			{
				super.paint(g);
				//获取节点文字信息字符串的长度
				FontMetrics fm=g.getFontMetrics();
				int swidth=fm.stringWidth(msg);
				//设置标签的首选大小
				this.setPreferredSize(new Dimension(swidth+17,15));
			}
		};	
		for(int i=0;i<3;i++)
		{
			if(tnv.getFloor()==i)
			{//按照层的不同为标签添加图标与文字
				jl.setIcon(new ImageIcon("D:\\"+(i+1)+".png"));
				jl.setText(tnv.toString().trim());
			}			
		}
		//判断节点当前是否为选中状态
		if(selected)
		{//若节点为选中状态则绘制背景
			jl.setBackground(new Color(98,176,255));
			jl.setOpaque(true);
		}
		//返回该标签
		return jl;
	}
}
//主窗体类
public class Sample30_10 extends JFrame implements TreeSelectionListener
{
	//声明用来记录数据库驱动类全称类名的字符串
	String driverClass;
	//声明用来记录数据库连接字符串的字符串
	String url;
	//声明用来记录数据库用户名、密码的字符串
	String user;
	String password;
	//创建显示数据库中表情况的树的根节点
	DefaultMutableTreeNode dmtnroot=new DefaultMutableTreeNode();
	//创建树模型
	DefaultTreeModel dtm=new DefaultTreeModel(dmtnroot);
	//创建树状列表控件
	JTree jtr=new JTree(dtm);
	//将树状列表放置到滚动窗口中
	JScrollPane jspl=new JScrollPane(jtr);
	//创建显示详细信息的表格
	JTable jta=new JTable();
	//将表格放置到滚动窗口中
	JScrollPane jspy=new JScrollPane(jta);	
	//创建包含树与表格的分割窗格
	JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspl,jspy);
	public Sample30_10()
	{
		//创建输入数据库连接信息的对话框
		new MyDialog(this);
		//初始化树状列表根节点信息
		this.initTreeRoot();
		//初始化树状列表表节点信息
		this.initTreeTable();
		//设置树根节点值对象的open属性
		((TreeNodeValue)dmtnroot.getUserObject()).setOpen(true);	
		//为树状列表注册监听器
		jtr.addTreeSelectionListener(this);					
		//设置分隔条的初始位置以及宽度
		jsp.setDividerLocation(200);
		jsp.setDividerSize(4);
		//将分割窗格添加进窗体
		this.add(jsp);
		//为树状列表设置自定义的绘制器
		jtr.setCellRenderer(new MyTreeCellRenderer());	
		//设置窗体的标题、大小位置以及可见性		
		this.setTitle("数据库管理器--DBManager");
		this.setBounds(100,100,600,400);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	//自定义的设置驱动类全称名、数据库连接字符串、用户名以及密码的方法
	public void setUNP(String driverClass,String url,String user,String password)
	{
		this.driverClass=driverClass;
		this.url=url;
		this.user=user;
		this.password=password;
	}
	//获取数据库连接的方法
	public Connection getConnection()
	{
		//定义数据库连接的引用
		Connection con=null;
		try
		{
			//加载指定数据库的驱动类
			Class.forName(driverClass);
	 		//根据指定的连接字符串、用户名以及密码获取数据库的连接
			con=DriverManager.getConnection(url,user,password);
		}
		catch(SQLException se)
		{//弹出数据库连接不成功对话框
			JOptionPane.showMessageDialog(this,
				"数据库连接不成功!!!","错误",JOptionPane.WARNING_MESSAGE);
		}
		catch(Exception e)
		{//弹出位置错误不成功对话框
			JOptionPane.showMessageDialog(this,
				"未知错误!!!","错误",JOptionPane.WARNING_MESSAGE);
		}
		return con;//返回连接
	}	
	//初始化树状列表根节点的方法
	public void initTreeRoot()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?