
【实例描述】IP地址是网络上每台计算机的标识,在浏览器中输入的网址也是要经过DNS服务器转换为IP地址才能找到服务器的,在很多网络程序中要求输入服务器IP地址或者对方连接的IP地址,IP地址的错误输入将使程序无法运行。
本实例将实现对IP地址的验证功能,实例的运行效果如图4.14所示。
【实现过程】(1)在Eclipse中新建项目CheckIP,并在其中创建一个CheckIP.java文件。
在该类的主方法中创建标准输入流的扫描器对象,接收用户输入的IP地址。
核心代码如下所示:protectedvoiddo_button_actionPerformed(ActionEvente){Stringtext=ipField.getText()//获取用户输入Stringinfo=matches(text)//对输入文本进行IP验证showMessageDialog(null,info)//用对话框输出验证结果}(2)编写IP地址的mathches()方法,该方法利用正则表达式对输入的字符串进行验证,并返回验证结果,关键代码如下所示。
publicStringmatches(Stringtext){if(text!=null&&!text.isEmpty()){//定义正则表达式Stringregex="^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"//判断IP地址是否与正则表达式匹配if(text.matches(regex)){//返回判断信息returntext+"\n是一个合法的IP地址!"}else{//返回判断信息returntext+"\n不是一个合法的IP地址!"}}//返回判断信息return"请输入要验证的IP地址!"}【代码解析】本实例的关键点在于IP地址格式与数字范围的验证,用户在输入IP地址时,程序可以获取的只有字符串类型,所以本实例利用字符串的灵活性和正则表达式搭配进行IP地址格式与范围的验证。
该方法是String字符串类的方法,用于判断字符串与制定的正则表达式是否匹配。
其声明语法如下:publicbooleanmathches(Stringregex)Java程序设计经典300例XXXVIII【知识扩展】在正则表达式中,“.”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符“.”,必须使用转义字符“\”。
/*
将以下代码保存为MainFrame.java JDK1.6编译通过
保存我没有做,也不难。方法我已经空下了,你可以自己写写试试.
把txtGuessRecord.getText()的内容写到文件里就行了
*/
import java.awt.Dimension
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.Random
import java.util.regex.Matcher
import java.util.regex.Pattern
import java.util.regex.PatternSyntaxException
import javax.swing.Box
import javax.swing.BoxLayout
import javax.swing.JButton
import javax.swing.JComboBox
import javax.swing.JFormattedTextField
import javax.swing.JFrame
import javax.swing.JLabel
import javax.swing.JScrollPane
import javax.swing.JTextArea
import javax.swing.SwingUtilities
import javax.swing.UIManager
import javax.swing.text.DefaultFormatter
public class MainFrame extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L
/**
* @param args
*/
private JLabel lblResult
private JLabel lblInfo
private JFormattedTextField txtInput
private JTextArea txtGuessRecord
private JButton btnGuess
private JButton btnRestart
private JButton btnClear
private JButton btnSave
private JComboBox cbType
// 是否正确
private boolean isRight = false
// 最大次数
private static final int MAX_TIME = 5
// 当前猜测的次数
private static final int NUM = 0
private static final int LETTER = 1
private static int current_time = 0
// 当前题目
private char current_puzzle = ' '
// 用户回答
private char player_answer = ' '
public MainFrame() {
initComponent()
setPreferredSize(new Dimension(450, 220))
pack()
setVisible(true)
setTitle("猜谜游戏")
setDefaultCloseOperation(DISPOSE_ON_CLOSE)
try {
UIManager
.setLookAndFeel(new com.sun.java.swing.plaf.windows.WindowsLookAndFeel())
SwingUtilities.updateComponentTreeUI(MainFrame.this)
} catch (Exception ex) {
}
}
// 初始化组件
private void initComponent() {
lblResult = new JLabel()
lblInfo = new JLabel("准备好了吗?", JLabel.LEFT)
txtGuessRecord = new JTextArea(5, 30)
btnGuess = new JButton("猜一下")
btnRestart = new JButton("开始")
btnClear = new JButton("清除")
btnSave = new JButton("保存")
String[] item = new String[] { "数字", "字母" }
cbType = new JComboBox(item)
cbType.setMaximumSize(new Dimension(70, 20))
String ps = "[a-zA-Z\\d]"
Pattern p = Pattern.compile(ps)
txtInput = new JFormattedTextField(new RegexFormatter(p))
txtInput.setMaximumSize(new Dimension(55, 20))
txtInput.setMinimumSize(new Dimension(55, 20))
btnRestart.addActionListener(this)
btnGuess.addActionListener(this)
btnClear.addActionListener(this)
btnGuess.setEnabled(false)
txtGuessRecord.setEditable(false)
setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS))
Box mainBox = Box.createVerticalBox()
add(mainBox)
setText('?')
mainBox.add(lblResult)
Box box = Box.createHorizontalBox()
box.add(lblInfo)
mainBox.add(box)
Box b = Box.createHorizontalBox()
b.add(txtInput)
Box hBox = Box.createHorizontalBox()
hBox.add(b)
hBox.add(btnGuess)
hBox.add(Box.createHorizontalStrut(3))
hBox.add(btnRestart)
hBox.add(Box.createHorizontalStrut(3))
hBox.add(btnClear)
hBox.add(Box.createHorizontalStrut(3))
hBox.add(btnSave)
hBox.add(Box.createHorizontalStrut(3))
hBox.add(cbType)
mainBox.add(hBox)
JScrollPane scroll = new JScrollPane(txtGuessRecord)
mainBox.add(scroll)
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnRestart) {
// 重玩
restart()
} else if (e.getSource() == btnGuess)
// 猜
guess()
else if (e.getSource() == btnClear)
// 清除
clear()
else if (e.getSource() == btnSave)
save()
}
// 设置显示答案
private void setText(char c) {
StringBuilder sb = new StringBuilder()
sb.append("<html><font size = 72 color = red><center>")
sb.append(c)
sb.append("</center></font></html>")
lblResult.setText(sb.toString())
}
// 创建随机字符
private char createRandomChar(int type) {
Random rand = new Random()
int low = 0
int range = 0
switch (type) {
case NUM:
low = (int) '0'
range = (int) '9' - low + 1
break
case LETTER:
low = (int) 'A'
range = (int) 'Z' - low + 1
break
}
int i = rand.nextInt(range) + low
char c = (char) i
return c
}
// 向记录框中输出时间
private void recordTime() {
Date date = new Date()
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
Locale.US)
String sd = formater.format(date)
txtGuessRecord.append(sd)
}
private void guess() {
if (txtInput.getValue() == null)
return
// 用户的答案
player_answer = Character.toUpperCase(txtInput.getValue().toString()
.charAt(0))
// 判断答案
if (player_answer < current_puzzle)
txtGuessRecord.append("小了\n")
else if (player_answer > current_puzzle)
txtGuessRecord.append("大了\n")
else {
txtGuessRecord.append("正确\n")
isRight = true
}
// 猜了一次
++current_time
// 显示游戏信息
showInfo()
if (isRight || current_time >= MAX_TIME)
stop()
}
// 重新开始
private void restart() {
// 记录时间
recordTime()
txtGuessRecord.append(" 游戏开始\n")
// 状态清零
current_time = 0
btnGuess.setEnabled(true)
isRight = false
current_puzzle = createRandomChar(cbType.getSelectedIndex())
setText('?')
showInfo()
}
// 停止游戏
private void stop() {
btnGuess.setEnabled(false)
setText(current_puzzle)
// 正确的情况
if (isRight) {
String info = String.format("你用了%d次猜对了\n", current_time)
txtGuessRecord.append(info)
} else
// 超过次数的情况
txtGuessRecord.append("你输了\n")
recordTime()
txtGuessRecord.append(" 游戏结束\n")
}
// 显示游戏信息
private void showInfo() {
String info = String.format("已经猜了%d次, 还剩 %d次 ", current_time,
MAX_TIME - current_time)
lblInfo.setText(info)
}
// 清空记录框
private void clear() {
txtGuessRecord.setText("")
}
private void save() {
// 尚未实现
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainFrame()
}
})
}
// 正则格式类, 文本框匹配用
class RegexFormatter extends DefaultFormatter {
/**
*
*/
private static final long serialVersionUID = 1L
private Pattern pattern
private Matcher matcher
public RegexFormatter() {
super()
}
public RegexFormatter(String pattern) throws PatternSyntaxException {
this()
setPattern(Pattern.compile(pattern))
}
public RegexFormatter(Pattern pattern) {
this()
setPattern(pattern)
}
public void setPattern(Pattern pattern) {
this.pattern = pattern
}
public Pattern getPattern() {
return pattern
}
protected void setMatcher(Matcher matcher) {
this.matcher = matcher
}
protected Matcher getMatcher() {
return matcher
}
public Object stringToValue(String text) throws ParseException {
Pattern pattern = getPattern()
if (pattern != null) {
Matcher matcher = pattern.matcher(text)
if (matcher.matches()) {
setMatcher(matcher)
return super.stringToValue(text)
}
throw new ParseException("Pattern did not match", 0)
}
return text
}
}
}
import java.awt.*import javax.swing.*
import java.awt.event.*
import javax.swing.event.*
/**
* 继承JFrame 实现 MouseMotionListener,ActionListener
*
*/
public class Exe10_1 extends JFrame implements MouseMotionListener,
ActionListener {
JLabel tracer//声明一个JLabel
JButton start//声明一个JButton
boolean tracing = true// 定义一个Boolean变量
/**
* 构造函数
*/
public Exe10_1() {
super("鼠标跟踪")//设置JFrame的title
setBounds(300, 300, 300, 300)// JFrame大小
setLayout(new FlowLayout())//JFrame的布局为FlowLayout
tracer = new JLabel()//给刚才声明的JLabel赋值
tracer.setPreferredSize(new Dimension(100, 30))//
tracer.setBackground(Color.blue)//设置背景色
tracer.setForeground(Color.white)//设置前景色
tracer.setOpaque(true)
addMouseMotionListener(this)//整个JFrame监听鼠标事件
add(tracer)//JFrame添加JLabel
start = new JButton("停止跟踪")//Jbutton初始化的名字为“停止跟随”
start.addActionListener(this)//JButton添加监听事件
add(start)//JFrame添加JLabel
setVisible(true)//JFrame的可见性
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)//右上角的【关闭】按钮
}
/* (当按下鼠标 不放开时 滑动鼠标 JLabel上打印内容)
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged(MouseEvent e) {
tracer.setText("(x,y) = (" + e.getX() + "," + e.getY() + ")")
}
/* (鼠标在JFrame上滑动时 JLabel上打印内容)
* @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
*/
public void mouseMoved(MouseEvent e) {
tracer.setText("(x,y) = (" + e.getX() + "," + e.getY() + ")")
}
/* (鼠标监听事件处理)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
if (tracing == true) {
removeMouseMotionListener(this)//JFrame移除监听鼠标事件
start.setText("继续跟踪")//JLabel重新设置Text
tracing = false
} else {
addMouseMotionListener(this)//JFrame添加鼠标事件监听
start.setText("停止跟踪")//JLabel重新设置Text
tracing = true
}
}
/** 程序入口
* @param args
*/
public static void main(String[] args) {
Exe10_1 frame = new Exe10_1()//生成一个Exe10_1的实例 实例名为:frame
}
}
希望对你有帮助
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)