我想用SWING做一个IP输入框,类似于微软的那个界面,就是IP间有几个点,输入完第一个IP后会自动跳到第二个输入框内
而且只能输入0-255的数字
请问该怎么做,最好有源代码参考一下了,高分送上,谢谢

解决方案 »

  1.   

    没有源代码,你自己实现了。我只是说一下方案:
    用4个JTextField,每两个JTextField之间放一个JLabel,该Label上有点字符,把所有组件布局在一个JPanel上,注册事件监听,处理键盘事件和JTextField的输入事件。
      

  2.   

    字符太多了分三下发,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);
    }
    }
      

  3.   

    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;
    }
    }
      

  4.   

    主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);
    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);
    }
    }
    }
      

  5.   

    怎么会不能运行呢,三个类都下了吗?06年做产品时的代码了,在快速回退时可能会有问题。Best Regards!
      

  6.   

    1、新建一个叫IPTextField的类,将我的IPTextField代码覆盖新创建的IPTextField2、拷贝JTextIPSpace,粘贴在IPTextField类的最下面3、拷贝IPDocument,粘贴在IPTextField类的最下面4、按(Ctrl+Shift+O)导入所需的Import5、格式化代码结构(按Ctrl+A全选IPTextField所有代码,Ctrl+Shift+F格式化代码)
      

  7.   

    可能不是代码的问题,我的一些其他程序也有这样问题
    我用eclipse,点运行方式的时候出现“无适用的”,不能运行
    用DOS编译的时候出现Exception in thread "main" java.lang.NoSuchMethodError: main 请问是怎么回事
      

  8.   

    你的classpath等环境变量配置了吗? 或者配置对了吗?
      

  9.   

    在Eclipse中对带main主方法的类,点击右键选择运行为(Run as)->Java程序(Java Application)如果没有Java程序选项,选择运行配置,创建一个Java程序,点击确定。试试看。
      

  10.   

    我classpath:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;classpath=%classpath%;e:\class
    其他程序能运行啊我看了一下你的程序没有主函数啊?
      

  11.   

    晕倒,给你提供的是一个组件,你可以添加到想要添加的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