这是一个SWING组件,可以直接实例化加到框架中 其思想就是创建4个带格式文本框,这个文本框只能输入0-255之间的数字,输入完一个可以直接跳到下一个输入框,支持小键盘左右键操作 package textField; import java.awt.Color; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.event.ComponentEvent; import java.awt.event.KeyEvent; import java.util.StringTokenizer; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; /** * 一个完整的IP输入框实例,只有一个文件 */ public class IPField extends JPanel { private static final Dimension fixedDimension = new Dimension(140, 26); private static final int fixedWidth = 140; // 组件的固定长度 private static final int fixedHeight = 26; // 组件的固定宽度 private String ipAddress; DigitalText digitalText1 = new DigitalText(); DigitalText digitalText2 = new DigitalText(); DigitalText digitalText3 = new DigitalText(); DigitalText digitalText4 = new DigitalText(); JLabel jLabel1 = new JLabel(); JLabel jLabel2 = new JLabel(); JLabel jLabel3 = new JLabel(); Border border; public IPField() { try { jbInit(); // 初始化 } catch (Exception ex) { ex.printStackTrace(); } } /** * <pre> * * Function: jbInit * Description: 初始化,由构造函数调用 * </pre> * * @param void * @return void * @exception Exception */ private void jbInit() throws Exception { border = BorderFactory.createEmptyBorder(); // 创建一个不占用空间的空边框(顶线、底线、左边框线和右边框线的宽度都为零) this.setLayout(null); this.setBorder(BorderFactory.createEtchedBorder()); // 创建一个具有“浮雕化”外观效果的边框,将组件的当前背景色用于高亮显示和阴影显示 this.addComponentListener(new java.awt.event.ComponentAdapter() { public void componentResized(ComponentEvent e) { this_componentResized(e); } }); this.setSize(fixedWidth, fixedHeight); this.setMaximumSize(fixedDimension); this.setMinimumSize(fixedDimension); this.setPreferredSize(fixedDimension); // 设置第一个输入框属性 digitalText1.setMaxLength(3); // 3列,即3位数 digitalText1.setMaxValue(255); digitalText1.setValue(255); digitalText1.setBorder(border); digitalText1.setHorizontalAlignment(SwingConstants.CENTER); digitalText1.setBounds(new Rectangle(2, 2, 30, 22)); // X坐标,Y坐标,宽,高 digitalText1.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(KeyEvent e) { digitalText1_keyReleased(e); } }); digitalText1.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(KeyEvent e) { digitalText1_keyPressed(e); } }); // 设置第二个输入框属性 digitalText2.setBounds(new Rectangle(37, 2, 30, 22)); digitalText2.setBorder(border); digitalText2.setHorizontalAlignment(SwingConstants.CENTER); digitalText2.setMaxLength(3); digitalText2.setMaxValue(255); digitalText2.setValue(255); digitalText2.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(KeyEvent e) { digitalText2_keyReleased(e); } }); digitalText2.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(KeyEvent e) { digitalText2_keyPressed(e); } }); // 设置第三个输入框属性 digitalText3.setBounds(new Rectangle(72, 2, 30, 22)); digitalText3.setBorder(border); digitalText3.setHorizontalAlignment(SwingConstants.CENTER); digitalText3.setMaxLength(3); digitalText3.setMaxValue(255); digitalText3.setValue(255); digitalText3.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(KeyEvent e) { digitalText3_keyReleased(e); } }); digitalText3.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(KeyEvent e) { digitalText3_keyPressed(e); } }); // 设置第四个输入框属性 digitalText4.setBounds(new Rectangle(107, 2, 30, 22)); digitalText4.setBorder(border); digitalText4.setHorizontalAlignment(SwingConstants.CENTER); digitalText4.setMaxLength(3); digitalText4.setMaxValue(255); digitalText4.setValue(255); digitalText4.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(KeyEvent e) { digitalText4_keyReleased(e); } }); digitalText4.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(KeyEvent e) { digitalText4_keyPressed(e); } }); jLabel1.setBounds(new Rectangle(30, 2, 8, 22)); jLabel1.setBackground(Color.white); jLabel1.setFont(new java.awt.Font("Dialog", 0, 13)); // 设置"."的字体 jLabel1.setForeground(Color.black); jLabel1.setOpaque(true); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); jLabel1.setText("."); jLabel2.setBounds(new Rectangle(65, 2, 8, 22)); jLabel2.setText("."); jLabel2.setForeground(Color.black); jLabel2.setOpaque(true); jLabel2.setHorizontalAlignment(SwingConstants.CENTER); jLabel2.setHorizontalTextPosition(SwingConstants.CENTER); jLabel2.setFont(new java.awt.Font("Dialog", 0, 13)); jLabel2.setBackground(Color.white); jLabel3.setBounds(new Rectangle(100, 2, 8, 22)); jLabel3.setText("."); jLabel3.setForeground(Color.black); jLabel3.setOpaque(true); jLabel3.setHorizontalAlignment(SwingConstants.CENTER); jLabel3.setFont(new java.awt.Font("Dialog", 0, 13)); jLabel3.setBackground(Color.white); this.add(digitalText1); this.add(jLabel1); this.add(digitalText2); this.add(jLabel2); this.add(digitalText3); this.add(jLabel3); this.add(digitalText4); this.setIpAddress("127.0.0.1"); // 默认本机IP } public void setEnabled(boolean valueSel) { if (valueSel == false) { digitalText1.setValue(0); digitalText2.setValue(0); digitalText3.setValue(0); digitalText4.setValue(0); digitalText1.setEditable(false); digitalText2.setEditable(false); digitalText3.setEditable(false); digitalText4.setEditable(false); } else { digitalText1.setEditable(true); digitalText2.setEditable(true); digitalText3.setEditable(true); digitalText4.setEditable(true); } } /** * <pre> * * Function: setIpAddress * Description: 设置IP地址 * </pre> * * @param newIpAddress * @return void * @exception void */ public void setIpAddress(String newIpAddress) { // 以"/"为分割符 StringTokenizer strToken = new StringTokenizer(newIpAddress, "."); String[] strIPAddress = new String[strToken.countTokens()]; if (strToken.countTokens() != 4) return; // 分割IP地址串 int k = 0; while (strToken.hasMoreTokens()) { strIPAddress[k] = strToken.nextToken(); k++; } // 给数组赋值 try { digitalText1.setValue(Integer.parseInt(strIPAddress[0])); digitalText2.setValue(Integer.parseInt(strIPAddress[1])); digitalText3.setValue(Integer.parseInt(strIPAddress[2])); digitalText4.setValue(Integer.parseInt(strIPAddress[3])); ipAddress = getIpAddress(); } catch (Exception e) { return; } } public void setText(String newIpAddress) { // 以"/"为分割符 StringTokenizer strToken = new StringTokenizer(newIpAddress, "."); String[] strIPAddress = new String[strToken.countTokens()]; if (strToken.countTokens() != 4) return; // 分割IP地址串 int k = 0; while (strToken.hasMoreTokens()) { strIPAddress[k] = strToken.nextToken(); k++; } // 给数组赋值 try { digitalText1.setValue(Integer.parseInt(strIPAddress[0])); digitalText2.setValue(Integer.parseInt(strIPAddress[1])); digitalText3.setValue(Integer.parseInt(strIPAddress[2])); digitalText4.setValue(Integer.parseInt(strIPAddress[3])); ipAddress = getIpAddress(); } catch (Exception e) { return; } } /** * <pre> * * Function: getIpAddress * Description: 从4个输入框获取IP地址 * </pre> * * @param void * @return void * @exception void */ public String getIpAddress() { ipAddress = Integer.toString(digitalText1.getValue()) + "." + Integer.toString(digitalText2.getValue()) + "." + Integer.toString(digitalText3.getValue()) + "." + Integer.toString(digitalText4.getValue()); return ipAddress; } public String getText() { ipAddress = Integer.toString(digitalText1.getValue()) + "." + Integer.toString(digitalText2.getValue()) + "." + Integer.toString(digitalText3.getValue()) + "." + Integer.toString(digitalText4.getValue()); return ipAddress; } void this_componentResized(ComponentEvent e) { this.setSize(fixedWidth, fixedHeight); validate(); } public void setBounds(int l, int t, int w, int h) { super.setBounds(l, t, fixedWidth, fixedHeight); return; } /** * <pre> * * Function: digitalText1_keyReleased * Description: 输入完一个IP后,自动跳到下一个输入框并选中该输入框全部数字 * </pre> * * @param e * @return void * @exception void */ void digitalText1_keyReleased(KeyEvent e) { if (e.getKeyCode() != KeyEvent.VK_LEFT && e.getKeyCode() != KeyEvent.VK_RIGHT && e.getKeyCode() != KeyEvent.VK_ESCAPE && e.getKeyCode() != KeyEvent.VK_ENTER) { if (digitalText1.getText().length() >= digitalText1.getMaxLength()) { digitalText2.requestFocus(); digitalText2.selectAll(); } } } void digitalText1_keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { if (digitalText1.getCaretPosition() == digitalText1.getText() .length()) { digitalText2.requestFocus(); digitalText2.selectAll(); } } } void digitalText2_keyReleased(KeyEvent e) { if (digitalText2.getText().length() >= digitalText2.getMaxLength()) { digitalText3.requestFocus(); digitalText3.selectAll(); } } void digitalText2_keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { if (digitalText2.getCaretPosition() == digitalText2.getText() .length()) { digitalText3.requestFocus(); digitalText3.selectAll(); } } if (e.getKeyCode() == KeyEvent.VK_LEFT) { if (digitalText2.getCaretPosition() == 0) { digitalText1.requestFocus(); digitalText1.selectAll(); } } } void digitalText3_keyReleased(KeyEvent e) { if (digitalText3.getText().length() >= digitalText3.getMaxLength()) { digitalText4.requestFocus(); digitalText4.selectAll(); } } void digitalText3_keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { if (digitalText3.getCaretPosition() == digitalText3.getText() .length()) { digitalText4.requestFocus(); digitalText4.selectAll(); } } if (e.getKeyCode() == KeyEvent.VK_LEFT) { if (digitalText3.getCaretPosition() == 0) { digitalText2.requestFocus(); digitalText2.selectAll(); } } } void digitalText4_keyReleased(KeyEvent e) { if (digitalText4.getText().length() >= digitalText4.getMaxLength()) { } } void digitalText4_keyPressed(KeyEvent e) { if (digitalText4.getCaretPosition() == 0) { digitalText3.requestFocus(); digitalText3.selectAll(); } } class DigitalTextDocument extends PlainDocument { private JTextField JTF; public DigitalTextDocument(JTextField tmpJTF) { JTF = tmpJTF; } // 重载父类的insertString函数 public void insertString(int offset, String str, AttributeSet a) throws BadLocationException { int valueAfterInsert = 0; String strBeforeInsert = getText(0, getLength()); String strAfterInsert = strBeforeInsert.substring(0, offset) + str + strBeforeInsert.substring(offset); // 首先保证插入该字符串后,是整数;如果不是,则不进行插入操作 try { valueAfterInsert = Integer.parseInt(strAfterInsert); } catch (NumberFormatException e) { return; } // 如果插入字符串str后,文档超长,则插入失败 if (strAfterInsert.length() > 3) return; // 如果插入后数据超出范围,插入失败,弹出警告 else if (valueAfterInsert > 255) { JTF.setText("255"); JOptionPane.showConfirmDialog(null, valueAfterInsert + "不是一个有效项目。请指定一个介于 0 和 255 之间的数值", "提示", JOptionPane.CLOSED_OPTION); JTF.setCaretPosition(0); } else { super.insertString(offset, str, a); return; } } } } 下面是个测试实例 package textField; import java.awt.Container; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JLabel; import textField.IPAddressField; public class Test { public static void main(String[] args) { JFrame frame = new JFrame("IP输入框"); Container container = frame.getContentPane(); container.setLayout(new FlowLayout()); JLabel ipLabel = new JLabel("IP: "); IPField ipField = new IPField(); int fixedHeight = 0; int fixedWidth = 0; ipField.setSize(fixedWidth, fixedHeight); container.add(ipLabel); container.add(ipField); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 200); frame.setLocation(500, 300); frame.setVisible(true); } }