JDBC实例之—手机号码归属地查询(GUI版本)
上一节完成了控制台版本,下面实现了GUI版本,GUI采用swing实现,自已找资料看了一下,看了常见的几个控件,入门还算简单,本例中用到JFrame,JButton,JTextField,JLabel这四个,他们的用法也很简单。
GUI版本完成了一些细节处理:
1.电话号码至少要输入7位,否则提示错误。输入超过7位时截取前7位放到数据库中查询。
2.文本输入框只能输入数字,不能输入其它字符,否则会发出系统错误提示音,并且输入不显示(输出不成功)。这部分靠TextField加入按键监听机制实现。
3.GUI界面窗体默认要显示在屏幕中央。
4.可以点击按钮查询结果,也可以输入完成后回册直接出结果,出完结果后要自动清空输入框,并且光标自动定位,输错还要能退格。
5.显示系统时间,这用到前面学到的Date类,把当前系统的时间,实时显示到Label标签上。
效果如下:
GUI部分有个Toolkit类可以获得系统屏幕信息,这样结合JFrame大小可以设置JFrame控件显示位置,在本例中,封装成GuiUtils.java,工具类!方法要声明为静态哦。
代码如下:
public static void setFrameCenter(JFrame jf)
{
//获取电脑屏幕分辨率
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension d = tk.getScreenSize();
//获取中心坐标
int width = (int)(d.getWidth() - jf.getWidth() ) /2;
int height = (int)(d.getHeight() - jf.getHeight()) /2;
//设置JFrame显示坐标
jf.setLocation(width, height);
}
主程序代码:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.*;
/**
* 号码查询类,完成数据库连接的创建,查询,遍历比较,结果返回
*
*
* */
class Query{
//SQL查询语句
private String sql = "Select * from T_PhoneNumber";
//创建数据库连接
private Connection conn = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
//输出
private String strPhoneNumber = null;
private String strArea = null; //输出号码归属地
private String strMobileType = null; //输出运营商类型
//号码查询方法封装
public String phoneNumberQuery(String phoneNumber) throws SQLException
{
try
{
conn = JdbcUtils.getConnection(); //获得连接
ps = conn.prepareStatement(sql); //获得预编译的 SQL语句的对象
rs = ps.executeQuery(); //获得查询结果集
//变量归零
strArea = null;
strMobileType = null;
rs.first(); //将结果集返回到第一行
//从第一行开始遍历直到查询成功,或者遍历到最后一行
while(rs.next())
{
//从数据库查询结果集中获取电话号码前7位
strPhoneNumber = rs.getString("PhonePrefix");
//逐条和输入电话号码进行比较
if(strPhoneNumber.equals(phoneNumber))
{
//查询成功,获取地区和运营商类型字段
strArea = rs.getString("Area");
strMobileType = rs.getString("MobileType");
//退出遍历
break;
}
}
//如果查旬结果为空
if(strArea == null && strMobileType == null)
{
System.out.println("查询结果为空");
return null;
}
else
{
//查询成功返回结果
return strArea + " " + strMobileType;
}
}
catch(SQLException e)
{
e.printStackTrace();
return null;
}
finally
{
//资源关闭
JdbcUtils.closeQuietly(rs);
JdbcUtils.closeQuietly(ps);
JdbcUtils.closeQuietly(conn);
}
}
}
/**
* 主程序类,完成GUI界面类的调用,查询类的调用,信息的输出显示
* */
public class PhoneNumberQuery
{
public static void main(String[] args) throws SQLException
{
//创建主界面
GuiView gui = new GuiView();
//创建查询对像
Query query = new Query();
//日期时间显示格式(Date, SimpleDateFormat类)
SimpleDateFormat dt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String inPhoneNumber = null; //输入的电话号码
String resInfo = null; //返回的查询结果信息
while(true)
{
Date t = new Date(); //获得当前的系统时间
gui.setDateTime(dt.format(t)); //格式化输出然后设置label标签
//循环查询输入的电话号码
inPhoneNumber = gui.getPhoneNumber();
//输入不为空
if(inPhoneNumber != null)
{
//打印调试
System.out.println(inPhoneNumber);
//输入电主号码至少要为7位
if(inPhoneNumber.length() >= 7)
{
//提取前7位
inPhoneNumber = inPhoneNumber.substring(0, 7);
//清空textField
gui.clearPhoneNumber();
//查询
resInfo = query.phoneNumberQuery(inPhoneNumber);
//查旬结果
gui.showMessage(resInfo);
}
else
{
//输入号码少于7位
gui.showMessageError();
}
}
}
}
}
界面实现代码:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
/**
* 号码归属地查询界面创建类
*
* */
public class GuiView
{
private JFrame mainJFrame = new JFrame("号码归属地查询");
private JTextField textField = new JTextField(15);
private JButton button = new JButton("查询");
private JLabel label = new JLabel("时间:2015年6月21日 22:06:00",SwingConstants.LEFT);
private JPanel panel_1 = new JPanel();
private JPanel panel_2 = new JPanel();
//系统标志变量
private boolean buttonFlag = false;
//构造函数
public GuiView()
{
//设置窗体大小
mainJFrame.setSize(300, 150);
//设置JFrame居中
GuiUtils.setFrameCenter(mainJFrame);
//设置panel_1布局管理器
panel_1.setLayout(new FlowLayout());
//panel_1添加组件
panel_1.add(textField);
panel_1.add(button);
mainJFrame.add(panel_1);
//panel_2添加组件
panel_2.add(label);
//mainJFrame添加组件
mainJFrame.setLayout(new BorderLayout());
mainJFrame.add(panel_1,BorderLayout.NORTH);
mainJFrame.add(panel_2,BorderLayout.CENTER);
//设置Frame支持关闭
mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置Frame可见
mainJFrame.setVisible(true);
//给button添加事件监听机制
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
if(buttonFlag == false)
{
buttonFlag = true;
}
}
});
//给textField添加按键监听机制
textField.addKeyListener(new KeyAdapter(){
@Override
public void keyTyped(KeyEvent e)
{
int ch = e.getKeyChar();
//输入是回册,则和按钮按下效果一样
if( ch == KeyEvent.VK_ENTER)
{
if(buttonFlag == false)
{
buttonFlag = true;
}
}
//如果是退格键
else if(ch == KeyEvent.VK_BACK_SPACE)
{
String str = textField.getText();
str = str.substring(0, str.length());
textField.setText(str);
}
//输入是数字则限定为0-9
else if( !(ch >= KeyEvent.VK_0 && ch <= KeyEvent.VK_9))
{
Toolkit.getDefaultToolkit().beep();
//e.setKeyChar('\0');
e.consume();
}
}
});
}
//设置Label显示系统时间
public void setDateTime(String text)
{
label.setText(text);
}
//获取输入的电话号码
public String getPhoneNumber()
{
if(buttonFlag == true) //查询按钮按下
{
buttonFlag = false;
return textField.getText();
}
else
{
return null;
}
}
//清空输入的电话号码,然后获取focus
public void clearPhoneNumber()
{
textField.setText("");
textField.requestFocus(); //获取光标
}
//显示查询结果
public void showMessage(String text)
{
if(text == null)
{
JOptionPane.showMessageDialog(mainJFrame, " 未知号码 ", "查询结果", JOptionPane.INFORMATION_MESSAGE);
}
else
{
JOptionPane.showMessageDialog(mainJFrame, text, "查询结果", JOptionPane.INFORMATION_MESSAGE);
}
}
//显示错误信息
public void showMessageError()
{
JOptionPane.showMessageDialog(mainJFrame, "电话号码不能少于7位!", "查询结果", JOptionPane.ERROR_MESSAGE);
}
}