📄 jipaddressfield.java~1~
字号:
/*
* 文件: JIPAddressField.java
* 日期 作者 改变情况
* 2004-9-1 Dorian 创建
*/
package chatClient;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;
/**
* <p>IP地址文本框</p>
* <P>=========================================================
* <p>可以像JTextField一样用setText(),getText()来存取值
* <p>可以设置为IPV4,IPV6或者更大.
* <P>=========================================================
* <P>Copyright (c) 2004 Dorian. All rights reserved</p>
* <P>@(#)JIPAddressField.java 创建日期 2004-9-1</p>
* <P>更新日期 2004-9-1</p>
* <p>@author <a href="mailto:Dorian@citiz.net">Dorian</a></p>
* <p>@version 1.0.0</p>
*/
public class JIPAddressField extends JTextField {
/**
* 无参构造器,提供默认地址"127.0.0.1"
* 默认为IPV4
*/
public JIPAddressField() {
this("127.0.0.1");
}
/**
* 可设置地址的构造器,默认为IPV4
* @param address 地址
*/
public JIPAddressField(String address) {
this(4,address);
}
/**
* 可设置IPV和地址的构造器
* @param IPV IPV
* @param address 地址
*/
public JIPAddressField(int IPV,String address) {
this.IPV = IPV; //设置IPV
int fieldWidth = IPV * 30; //计算文本框的宽
setPreferredSize(new Dimension(fieldWidth,25)); //设置文本框的默认大小
setLayout(new BoxLayout(this,BoxLayout.X_AXIS));//设置Layout为BoxLayout
setFocusable(false); //设置不获取焦点
//左右键移动监听器
LeftRightListener lrListener = new LeftRightListener();
for(int i=1;i<=IPV;i++) {
if(i != 1) //第一个不添加"."
add(createlabDot("."));
//创建新的数字框
JNumberField ip;
if(i == IPV)
ip = new JNumberField(0,3,0,255,false);
else
ip = new JNumberField(0,3,0,255,true);
ip.addKeyListener(lrListener);
ip.setBorder(null); //设置为无边框
//添加到map中并加载
map.put(""+i,ip);
add(ip);
}
add(createlabDot(" "));
setIPAddress(address); //设置IP地址
setFieldTransListener(); //设置转移监听器
}// End JIPAddressField Constructor
//创建IP地址中的"."
private JLabel createlabDot(String dot) {
JLabel lab = new JLabel(dot);
lab.setOpaque(false); //设置为透明
lab.setIgnoreRepaint(true); //忽略重绘
lab.setBorder(null); //不绘制边框
lab.setFocusable(false); //不得到焦点
return lab;
}
/**
* 设置IP地址
* @see javax.swing.text.JTextComponent#setText(java.lang.String)
*/
public void setText(String address) {
setIPAddress(address);
}
/**
* 获取IP地址
* @see javax.swing.text.JTextComponent#getText()
*/
public String getText() {
return getIPAddress();
}
//设置IP
private void setIPAddress(String address) {
if (address != null && address.equals("")) {
String[] temp = new String[IPV];
for(int i=1;i<=IPV;i++)
temp[i-1] = "";
setIPField(temp); //设置为空
}
else {
int dotIndex = address.indexOf("."); //点的位置
String strIP[] = address.split("\\."); //IP分段
int dotNumber = strIP.length; //点的个数(分段的个数)
if (address == null || dotIndex == -1 || dotNumber != IPV) {
//不抛出异常,设置其为空
setIPAddress("");
return;
}
setIPField(strIP);
}
}
//获取IP
private String getIPAddress() {
StringBuffer bufString = new StringBuffer();
for(int i=1;i<=IPV;i++) {
String temp = ((JNumberField)map.get(i+"")).getText().trim();
if(i == IPV)
bufString.append(temp);
else
bufString.append(temp + ".");
}
return bufString.toString();
}
//设置Ip到数字框
private void setIPField(String[] arg) {
for(int i=0;i<IPV;i++)
((JNumberField)map.get(i+1+"")).setText(arg[i]);
}
//设置转移监听器
//转移的方向为:左->前一个;右->后一个
private void setFieldTransListener() {
((JNumberField)map.get("1")).addPropertyChangeListener(new LRTransListener(
null,(JNumberField)map.get("2")));
for(int i=2;i<IPV;i++) {
JNumberField left = (JNumberField)map.get(i-1+"");
JNumberField right= (JNumberField)map.get(i+1+"");
((JNumberField)map.get(""+i)).addPropertyChangeListener(new LRTransListener(left,right));
}
((JNumberField)map.get(""+IPV)).addPropertyChangeListener(new LRTransListener(
(JNumberField)map.get(IPV-1+""),null));
}
private int IPV = 4; //IPV
private Map map = new HashMap(); //存储数字框
/**
* <p>左右键监听器</p>
* <P>=========================================================
* <p>左右键监听器
* <P>=========================================================
* <P>Copyright (c) 2004 Dorian. All rights reserved</p>
* <P>@(#)JIPAddressField.java 创建日期 2004-9-2</p>
* <P>更新日期 2004-9-2</p>
* <p>@author <a href="mailto:Dorian@citiz.net">Dorian</a></p>
* <p>@version 1.0.0</p>
*/
class LeftRightListener extends KeyAdapter {
public static final String LEFT_TRAN = "LEFT_TRAN";
public static final String RIGHT_TRAN = "RIGHT_TRAN";
public void keyPressed(KeyEvent keyEvent) {
JTextComponent text = (JTextComponent)keyEvent.getComponent();
if (keyEvent.getKeyCode() == KeyEvent.VK_LEFT) {
if (text.getCaretPosition() == 0) {
//激活PropertyChange事件
text.firePropertyChange(LEFT_TRAN, 0, 1);
}
}
else if (keyEvent.getKeyCode() == KeyEvent.VK_RIGHT) {
if (text.getCaretPosition() == text.getText().length()) {
text.firePropertyChange(RIGHT_TRAN, 0, 1);
}
}
}
}// End LeftRightListener Class
/**
* <p>转移监听器</p>
* <P>=========================================================
* <p>转移监听器
* <P>=========================================================
* <P>Copyright (c) 2004 Dorian. All rights reserved</p>
* <P>@(#)JIPAddressField.java 创建日期 2004-9-2</p>
* <P>更新日期 2004-9-2</p>
* <p>@author <a href="mailto:Dorian@citiz.net">Dorian</a></p>
* <p>@version 1.0.0</p>
*/
class LRTransListener implements PropertyChangeListener {
public LRTransListener(Component leftComponent,Component rightComponent) {
this.leftComponent = leftComponent;
this.rightComponent = rightComponent;
}
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName() == LeftRightListener.LEFT_TRAN) {
if (leftComponent != null) {
//设置焦点
leftComponent.requestFocus();
}
}
else if (evt.getPropertyName() == LeftRightListener.RIGHT_TRAN) {
if (rightComponent != null) {
rightComponent.requestFocus();
}
}
}
private Component leftComponent, rightComponent;
}// End LRTransListener Class
}// End JIPAddressField Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -