用SWING实现类似微软的IP输入框的问题 我想用SWING做一个IP输入框,类似于微软的那个界面,就是IP间有几个点,输入完第一个IP后会自动跳到第二个输入框内而且只能输入0-255的数字请问该怎么做,最好有源代码参考一下了,高分送上,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有源代码,你自己实现了。我只是说一下方案:用4个JTextField,每两个JTextField之间放一个JLabel,该Label上有点字符,把所有组件布局在一个JPanel上,注册事件监听,处理键盘事件和JTextField的输入事件。 字符太多了分三下发,IPDocument:protected class IPDocument extends PlainDocument {public JTextField jtext;public IPDocument(JTextField jtext) {this.jtext = jtext;}public void insertString(int offset, String str, AttributeSet a)throws BadLocationException {char[] insertChars = str.toCharArray();boolean valid = true;if (getLength() >= 3) {valid = false;return;}for (int i = 0; i < Math.min(insertChars.length, 3); i++) {if (!(Character.isDigit(insertChars[i]))) {valid = false;break;} else {valid = true;break;}}if (valid)super.insertString(offset, str, a);if (getLength() > 3)super.remove(offset + str.length(), getLength() - 2);}} IP框中的每一个输入框,JTextIPSpace:class JTextIPSpace extends JTextField {public int minValue = 0;public int maxValue = 255;public JTextIPSpace textipspace;public boolean bFirstLostFocus = true;public boolean isCanFocus = false;public JTextField prevComponent;public JTextField nextComponent;public JTextIPSpace() {this(null, 255, false);}public JTextIPSpace(String str) {this(str, 255, true);}public JTextIPSpace(int maxValue, boolean isCanFocus) {this(null, maxValue, isCanFocus);}public JTextIPSpace(String str, int maxValue, boolean isCanFocus) {super(str);setNoEdge();setMidHorizontal();addLostFocus();addKeySet();addComponentChange();textipspace = this;this.maxValue = maxValue;this.isCanFocus = isCanFocus;}public void setNoEdge() {setBorder(null);setOpaque(true);}public void setPrevNextComponent(JTextField prev, JTextField next) {this.prevComponent = prev;this.nextComponent = next;}private void addComponentChange() {ComponentListener cl = new ComponentListener() {public void componentResized(ComponentEvent e) {}public void componentMoved(ComponentEvent e) {}public void componentShown(ComponentEvent e) {}public void componentHidden(ComponentEvent e) {}};addComponentListener(cl);}private void addLostFocus() {FocusListener fl = new FocusListener() {public void focusLost(FocusEvent e) {String tmp = getText().trim();if (tmp.equals(""))return;if (Integer.parseInt(tmp) > maxValue && bFirstLostFocus == true) {bFirstLostFocus = false;JOptionPane.showConfirmDialog(textipspace, tmp+ "不是一个合法的项目,请输入" + minValue + "~" + maxValue+ "之间的数值!", "提示", JOptionPane.CLOSED_OPTION);setText(String.valueOf(maxValue));requestFocus();repaint();}}public void focusGained(FocusEvent e) {bFirstLostFocus = true;repaint();}};addFocusListener(fl);}private void addKeySet() {KeyAdapter ka = new KeyAdapter() {public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_LEFT) {int pos = getCaretPosition();if (pos == 0) {gotoComponent(prevComponent);}} else if (e.getKeyCode() == KeyEvent.VK_UP) {if (prevComponent != null)prevComponent.selectAll();gotoComponent(prevComponent);} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {if (nextComponent != null)nextComponent.selectAll();gotoComponent(nextComponent);} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {int pos = getCaretPosition();int maxPos = getText().trim().length();if (pos == maxPos || maxPos == 0) {gotoComponent(nextComponent);}} else if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {int pos = getCaretPosition();if (pos == 0) {gotoComponent(prevComponent);}} else if (e.getKeyChar() == '.') {int maxPos = getText().trim().length();if (maxPos > 0) {if (getSelectedText() == null) {if (nextComponent != null)nextComponent.selectAll();gotoComponent(nextComponent);}}}}public void keyReleased(KeyEvent e) {if (Character.isDigit(e.getKeyChar())) {int pos = getCaretPosition();if (pos >= 3) {gotoComponent(nextComponent);}}}};addKeyListener(ka);}public void gotoComponent(JComponent jc) {if (jc != null)jc.requestFocus();}public void setMidHorizontal() {setHorizontalAlignment(JTextField.CENTER);}protected Document createDefaultModel() {return new IPDocument(this);}public boolean isFocusTraversable() {return isCanFocus;}} 主IP输入框,IPTextField:public class IPTextField extends JTextField { private String st1 = ""; private String st2 = ""; private String st3 = ""; private String st4 = ""; private JTextIPSpace t1; private JTextIPSpace t2; private JTextIPSpace t3; private JTextIPSpace t4; final private static int RADII = 2; final private static int SPACEINTERVAL = 2; private Color DefaultColor_Selected = new Color(255, 0, 0); private Color DefaultColor_NoSelected = Color.black; public IPTextField(boolean isSelected) { this(isSelected, ""); } public IPTextField(String ipAddress) { this(false, ipAddress); } public IPTextField() { this(false); } public IPTextField(boolean isSelected, Color colorSelect, Color colorNoSelect) { this(isSelected, "", colorSelect, colorNoSelect); } public IPTextField(boolean isSelected, String ipAddress) { this(isSelected, "", null, null);}public IPTextField(boolean isSelected, String ipAddress, Color colorSelect,Color colorNoSelect) {super();analyzeStr(ipAddress);InitIPField();setChildComponent(false);setLayout(null);t1.setPrevNextComponent(t4, t2);t2.setPrevNextComponent(t1, t3);t3.setPrevNextComponent(t2, t4);t4.setPrevNextComponent(t3, t1);add(t1);add(t2);add(t3);add(t4);addComponentListener(new ComponentListener() {public void componentResized(ComponentEvent e) {changeChildComponent();}public void componentMoved(ComponentEvent e) {}public void componentShown(ComponentEvent e) {}public void componentHidden(ComponentEvent e) {}});setChildComponent(true);if (colorSelect != null)DefaultColor_Selected = colorSelect;if (colorNoSelect != null)DefaultColor_NoSelected = colorNoSelect;setSelectEdge(isSelected, DefaultColor_Selected,DefaultColor_NoSelected);}public void setSelected(Color color) {DefaultColor_Selected = color;}public void setSelected() {DefaultColor_Selected = Color.blue;}public void setNoSelected(Color color) {DefaultColor_NoSelected = color;}public void setNoSelected() {DefaultColor_NoSelected = Color.black;}public void setSelectEdge(boolean isSelected, Color selected,Color noSelected) {Border border;if (isSelected)border = BorderFactory.createLineBorder(selected.brighter(), 1);elseborder = BorderFactory.createLineBorder(noSelected, 1);setBorder(border);}public Dimension getPreferredSize() {Dimension dim = new Dimension(100, 30);return dim;}private void InitIPField() {t1 = new JTextIPSpace(st1, 255, true);t2 = new JTextIPSpace(st2, 255, true);t3 = new JTextIPSpace(st3, 255, true);t4 = new JTextIPSpace(st4, 255, true);}private void setTextIPField() {t1.setText(st1);t2.setText(st2);t3.setText(st3);t4.setText(st4);}public void setText(String text) {st1 = "";st2 = "";st3 = "";st4 = "";analyzeStr(text);setTextIPField();}public void setIP(String ip) {setText(ip);}public String getIP() {return availIP();}public String getText() {return getIP();}public void setIPValue(int ip) {}public int getIPValue() {return isIPaddress(getIP());}private String availIP() {String strTemp[] = { t1.getText().trim(), t2.getText().trim(),t3.getText().trim(), t4.getText().trim() };String returnIP = "";for (int i = 0; i < strTemp.length; i++) {if (!strTemp[i].equals("")) {if (!returnIP.equals(""))returnIP += "." + strTemp[i];elsereturnIP = strTemp[i];}}return returnIP;}public static int isIPaddress(String ipAddress) {int pointNum = 0, numberNum = 0;int numberVal = 0;int len = ipAddress.length();int m = 0;int IPVal = 0;char tempchar;while (m < len&& ((tempchar = ipAddress.charAt(m)) == '.' || Character.isDigit(tempchar))) {m++;if ((48 <= tempchar) && (tempchar <= 57)) {if (numberNum > 2)return -1;numberVal *= 10;numberVal += tempchar - '0';if (numberVal > 255)return -1;numberNum++;} else {if (numberNum == 0)return -1;if (pointNum == 3)return -1;pointNum++;IPVal *= 256;IPVal += numberVal;numberNum = 0;numberVal = 0;}}if (m != len || pointNum != 3 || numberNum == 0)return -1;pointNum++;IPVal *= 256;IPVal += numberVal;return IPVal;}private void analyzeStr(String str) {try {StringTokenizer st = new StringTokenizer(str, ".");String tk = "";int i = 0;while (st.hasMoreTokens() && i <= 3) {i++;tk = st.nextToken();if (!tk.equals("")) {switch (i) {case 1:st1 = tk;break;case 2:st2 = tk;break;case 3:st3 = tk;break;case 4:st4 = tk;break;}}tk = "";}} catch (Exception ex) {st1 = "";st2 = "";st3 = "";st4 = "";}}private void changeChildComponent() {Dimension sz = getSize();int spaceWidth = sz.width / 4;int spaceHeight = sz.height - 2 * SPACEINTERVAL;int r = RADII;t1.setBounds(0 + SPACEINTERVAL, 0 + SPACEINTERVAL, spaceWidth - r,spaceHeight);t2.setBounds(spaceWidth + r, 0 + SPACEINTERVAL, spaceWidth - r,spaceHeight);t3.setBounds(2 * spaceWidth + r, 0 + SPACEINTERVAL, spaceWidth - r,spaceHeight);t4.setBounds(3 * spaceWidth + r, 0 + SPACEINTERVAL, spaceWidth - r- SPACEINTERVAL, spaceHeight);repaint();}private void setChildComponent(boolean isVisible) {t1.setVisible(isVisible);t2.setVisible(isVisible);t3.setVisible(isVisible);t4.setVisible(isVisible);repaint();}/** * 绘制IP点 */public void paintComponent(Graphics g) {Dimension sz = getSize();g.setColor(Color.white);g.fillRect(0, 0, sz.width, sz.height);int spaceWidth = sz.width / 4;int spaceHeight = sz.height;int r = RADII;g.setColor(Color.black);for (int i = 1; i <= 3; i++) {g.fillOval(i * spaceWidth, spaceHeight - 2 * r, r, r);}}} 怎么会不能运行呢,三个类都下了吗?06年做产品时的代码了,在快速回退时可能会有问题。Best Regards! 1、新建一个叫IPTextField的类,将我的IPTextField代码覆盖新创建的IPTextField2、拷贝JTextIPSpace,粘贴在IPTextField类的最下面3、拷贝IPDocument,粘贴在IPTextField类的最下面4、按(Ctrl+Shift+O)导入所需的Import5、格式化代码结构(按Ctrl+A全选IPTextField所有代码,Ctrl+Shift+F格式化代码) 可能不是代码的问题,我的一些其他程序也有这样问题我用eclipse,点运行方式的时候出现“无适用的”,不能运行用DOS编译的时候出现Exception in thread "main" java.lang.NoSuchMethodError: main 请问是怎么回事 你的classpath等环境变量配置了吗? 或者配置对了吗? 在Eclipse中对带main主方法的类,点击右键选择运行为(Run as)->Java程序(Java Application)如果没有Java程序选项,选择运行配置,创建一个Java程序,点击确定。试试看。 我classpath:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;classpath=%classpath%;e:\class其他程序能运行啊我看了一下你的程序没有主函数啊? 晕倒,给你提供的是一个组件,你可以添加到想要添加的Panel中。这样吧,你再创建一个类,与IPTextField同目录:public class TestIPTextField extends JFrame{public TestIPTextField(){getContentPane().add(new IPTextField());setSize(100,50);setLocation(400,400);setTitle("IP 测试");}public static void main(String[] args){TestIPTextField frame = new TestIPTextField();frame.setVisible(true);}}classpath:%JAVA_HOME%\jre\lib\rt.jar 如何理解java中的接口啊!! jfreechart如何禁用默认的右键菜单并添加自己写的右键弹出菜单? 简单的问题,需要大家帮我看下 为什么这段程序输出是18而不是是17? 跨计算机写文件 如何把一个InputStream对象中字符串和二进制分开读出来!!! 一个dos下调试java的问题 jbuilder安装后怎么不能用? 驱动没了,这下没戏了5555555...... 哪儿有swing包的详细说明手册,要有关于每个控件的方法和属性的详细说明,并请告诉我下载地址? java自带的正则表达式类库的效率 Set<E>的小问题
用4个JTextField,每两个JTextField之间放一个JLabel,该Label上有点字符,把所有组件布局在一个JPanel上,注册事件监听,处理键盘事件和JTextField的输入事件。
protected class IPDocument extends PlainDocument {
public JTextField jtext;public IPDocument(JTextField jtext) {
this.jtext = jtext;
}public void insertString(int offset, String str, AttributeSet a)
throws BadLocationException {
char[] insertChars = str.toCharArray();
boolean valid = true;
if (getLength() >= 3) {
valid = false;
return;
}
for (int i = 0; i < Math.min(insertChars.length, 3); i++) {
if (!(Character.isDigit(insertChars[i]))) {
valid = false;
break;
} else {
valid = true;
break;
}
}
if (valid)
super.insertString(offset, str, a);
if (getLength() > 3)
super.remove(offset + str.length(), getLength() - 2);
}
}
public int minValue = 0;
public int maxValue = 255;
public JTextIPSpace textipspace;
public boolean bFirstLostFocus = true;
public boolean isCanFocus = false;
public JTextField prevComponent;
public JTextField nextComponent;public JTextIPSpace() {
this(null, 255, false);
}public JTextIPSpace(String str) {
this(str, 255, true);
}public JTextIPSpace(int maxValue, boolean isCanFocus) {
this(null, maxValue, isCanFocus);
}public JTextIPSpace(String str, int maxValue, boolean isCanFocus) {
super(str);
setNoEdge();
setMidHorizontal();
addLostFocus();
addKeySet();
addComponentChange();textipspace = this;
this.maxValue = maxValue;
this.isCanFocus = isCanFocus;
}public void setNoEdge() {
setBorder(null);
setOpaque(true);
}public void setPrevNextComponent(JTextField prev, JTextField next) {
this.prevComponent = prev;
this.nextComponent = next;
}private void addComponentChange() {
ComponentListener cl = new ComponentListener() {
public void componentResized(ComponentEvent e) {}public void componentMoved(ComponentEvent e) {
}public void componentShown(ComponentEvent e) {
}public void componentHidden(ComponentEvent e) {
}
};
addComponentListener(cl);
}private void addLostFocus() {
FocusListener fl = new FocusListener() {
public void focusLost(FocusEvent e) {
String tmp = getText().trim();
if (tmp.equals(""))
return;
if (Integer.parseInt(tmp) > maxValue && bFirstLostFocus == true) {
bFirstLostFocus = false;
JOptionPane.showConfirmDialog(textipspace, tmp
+ "不是一个合法的项目,请输入" + minValue + "~" + maxValue
+ "之间的数值!", "提示", JOptionPane.CLOSED_OPTION);
setText(String.valueOf(maxValue));
requestFocus();
repaint();
}
}public void focusGained(FocusEvent e) {
bFirstLostFocus = true;
repaint();
}};
addFocusListener(fl);
}private void addKeySet() {
KeyAdapter ka = new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
int pos = getCaretPosition();
if (pos == 0) {
gotoComponent(prevComponent);
}
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
if (prevComponent != null)
prevComponent.selectAll();
gotoComponent(prevComponent);
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
if (nextComponent != null)
nextComponent.selectAll();
gotoComponent(nextComponent);
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
int pos = getCaretPosition();
int maxPos = getText().trim().length();
if (pos == maxPos || maxPos == 0) {
gotoComponent(nextComponent);
}
} else if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
int pos = getCaretPosition();
if (pos == 0) {
gotoComponent(prevComponent);
}
} else if (e.getKeyChar() == '.') {
int maxPos = getText().trim().length();
if (maxPos > 0) {
if (getSelectedText() == null) {
if (nextComponent != null)
nextComponent.selectAll();
gotoComponent(nextComponent);
}
}
}
}public void keyReleased(KeyEvent e) {
if (Character.isDigit(e.getKeyChar())) {
int pos = getCaretPosition();
if (pos >= 3) {
gotoComponent(nextComponent);
}
}
}
};
addKeyListener(ka);
}public void gotoComponent(JComponent jc) {
if (jc != null)
jc.requestFocus();
}public void setMidHorizontal() {
setHorizontalAlignment(JTextField.CENTER);
}protected Document createDefaultModel() {
return new IPDocument(this);
}public boolean isFocusTraversable() {
return isCanFocus;
}
}
private String st1 = "";
private String st2 = "";
private String st3 = "";
private String st4 = ""; private JTextIPSpace t1;
private JTextIPSpace t2;
private JTextIPSpace t3;
private JTextIPSpace t4; final private static int RADII = 2;
final private static int SPACEINTERVAL = 2; private Color DefaultColor_Selected = new Color(255, 0, 0);
private Color DefaultColor_NoSelected = Color.black; public IPTextField(boolean isSelected) {
this(isSelected, "");
} public IPTextField(String ipAddress) {
this(false, ipAddress);
} public IPTextField() {
this(false);
} public IPTextField(boolean isSelected, Color colorSelect, Color colorNoSelect) {
this(isSelected, "", colorSelect, colorNoSelect);
} public IPTextField(boolean isSelected, String ipAddress) {
this(isSelected, "", null, null);
}public IPTextField(boolean isSelected, String ipAddress, Color colorSelect,
Color colorNoSelect) {
super();
analyzeStr(ipAddress);
InitIPField();
setChildComponent(false);
setLayout(null);t1.setPrevNextComponent(t4, t2);
t2.setPrevNextComponent(t1, t3);
t3.setPrevNextComponent(t2, t4);
t4.setPrevNextComponent(t3, t1);add(t1);
add(t2);
add(t3);
add(t4);addComponentListener(new ComponentListener() {
public void componentResized(ComponentEvent e) {
changeChildComponent();
}public void componentMoved(ComponentEvent e) {
}public void componentShown(ComponentEvent e) {
}public void componentHidden(ComponentEvent e) {
}
});
setChildComponent(true);
if (colorSelect != null)
DefaultColor_Selected = colorSelect;
if (colorNoSelect != null)
DefaultColor_NoSelected = colorNoSelect;
setSelectEdge(isSelected, DefaultColor_Selected,
DefaultColor_NoSelected);
}public void setSelected(Color color) {
DefaultColor_Selected = color;
}public void setSelected() {
DefaultColor_Selected = Color.blue;
}public void setNoSelected(Color color) {
DefaultColor_NoSelected = color;
}public void setNoSelected() {
DefaultColor_NoSelected = Color.black;
}public void setSelectEdge(boolean isSelected, Color selected,
Color noSelected) {
Border border;
if (isSelected)
border = BorderFactory.createLineBorder(selected.brighter(), 1);
else
border = BorderFactory.createLineBorder(noSelected, 1);
setBorder(border);
}public Dimension getPreferredSize() {
Dimension dim = new Dimension(100, 30);
return dim;
}private void InitIPField() {
t1 = new JTextIPSpace(st1, 255, true);
t2 = new JTextIPSpace(st2, 255, true);
t3 = new JTextIPSpace(st3, 255, true);
t4 = new JTextIPSpace(st4, 255, true);
}private void setTextIPField() {
t1.setText(st1);
t2.setText(st2);
t3.setText(st3);
t4.setText(st4);
}public void setText(String text) {
st1 = "";
st2 = "";
st3 = "";
st4 = "";
analyzeStr(text);
setTextIPField();
}public void setIP(String ip) {
setText(ip);
}public String getIP() {
return availIP();
}public String getText() {
return getIP();
}public void setIPValue(int ip) {
}public int getIPValue() {
return isIPaddress(getIP());
}private String availIP() {
String strTemp[] = { t1.getText().trim(), t2.getText().trim(),
t3.getText().trim(), t4.getText().trim() };
String returnIP = "";
for (int i = 0; i < strTemp.length; i++) {
if (!strTemp[i].equals("")) {
if (!returnIP.equals(""))
returnIP += "." + strTemp[i];
else
returnIP = strTemp[i];
}
}
return returnIP;
}public static int isIPaddress(String ipAddress) {
int pointNum = 0, numberNum = 0;
int numberVal = 0;
int len = ipAddress.length();
int m = 0;
int IPVal = 0;
char tempchar;
while (m < len
&& ((tempchar = ipAddress.charAt(m)) == '.' || Character
.isDigit(tempchar))) {
m++;
if ((48 <= tempchar) && (tempchar <= 57)) {
if (numberNum > 2)
return -1;
numberVal *= 10;
numberVal += tempchar - '0';
if (numberVal > 255)
return -1;
numberNum++;
} else {
if (numberNum == 0)
return -1;
if (pointNum == 3)
return -1;
pointNum++;
IPVal *= 256;
IPVal += numberVal;
numberNum = 0;
numberVal = 0;
}
}
if (m != len || pointNum != 3 || numberNum == 0)
return -1;
pointNum++;
IPVal *= 256;
IPVal += numberVal;
return IPVal;
}private void analyzeStr(String str) {
try {
StringTokenizer st = new StringTokenizer(str, ".");String tk = "";int i = 0;
while (st.hasMoreTokens() && i <= 3) {
i++;
tk = st.nextToken();
if (!tk.equals("")) {
switch (i) {
case 1:
st1 = tk;
break;
case 2:
st2 = tk;
break;
case 3:
st3 = tk;
break;
case 4:
st4 = tk;
break;
}
}
tk = "";
}
} catch (Exception ex) {
st1 = "";
st2 = "";
st3 = "";
st4 = "";
}
}private void changeChildComponent() {
Dimension sz = getSize();
int spaceWidth = sz.width / 4;
int spaceHeight = sz.height - 2 * SPACEINTERVAL;
int r = RADII;t1.setBounds(0 + SPACEINTERVAL, 0 + SPACEINTERVAL, spaceWidth - r,
spaceHeight);
t2.setBounds(spaceWidth + r, 0 + SPACEINTERVAL, spaceWidth - r,
spaceHeight);
t3.setBounds(2 * spaceWidth + r, 0 + SPACEINTERVAL, spaceWidth - r,
spaceHeight);
t4.setBounds(3 * spaceWidth + r, 0 + SPACEINTERVAL, spaceWidth - r
- SPACEINTERVAL, spaceHeight);repaint();
}private void setChildComponent(boolean isVisible) {
t1.setVisible(isVisible);
t2.setVisible(isVisible);
t3.setVisible(isVisible);
t4.setVisible(isVisible);
repaint();
}/**
* 绘制IP点
*/
public void paintComponent(Graphics g) {
Dimension sz = getSize();
g.setColor(Color.white);
g.fillRect(0, 0, sz.width, sz.height);int spaceWidth = sz.width / 4;
int spaceHeight = sz.height;
int r = RADII;
g.setColor(Color.black);
for (int i = 1; i <= 3; i++) {
g.fillOval(i * spaceWidth, spaceHeight - 2 * r, r, r);
}
}
}
我用eclipse,点运行方式的时候出现“无适用的”,不能运行
用DOS编译的时候出现Exception in thread "main" java.lang.NoSuchMethodError: main 请问是怎么回事
其他程序能运行啊我看了一下你的程序没有主函数啊?
public TestIPTextField(){
getContentPane().add(new IPTextField());
setSize(100,50);
setLocation(400,400);
setTitle("IP 测试");
}public static void main(String[] args){
TestIPTextField frame = new TestIPTextField();
frame.setVisible(true);
}
}classpath:%JAVA_HOME%\jre\lib\rt.jar