也是上段代码,eclipse中编译出错,错误如下:
Exception in thread "main"com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException: Not a byte[]at formattest.IPAddressFormatter.valueToString(IPAddressFormatter.java:16)
at javax.swing.JFormattedTextField$AbstractFormatter.install(JFormattedTextField.java:932)
at javax.swing.text.DefaultFormatter.install(DefaultFormatter.java:105)
at javax.swing.JFormattedTextField.setFormatter(JFormattedTextField.java:448)
at javax.swing.JFormattedTextField.setValue(JFormattedTextField.java:772)
at javax.swing.JFormattedTextField.setFormatterFactory(JFormattedTextField.java:404)
at javax.swing.JFormattedTextField.<init>(JFormattedTextField.java:308)
at javax.swing.JFormattedTextField.<init>(JFormattedTextField.java:297)
at formattest.FormatTestFrame.<init>(FormatTestFrame.java:112)
at formattest.FormatTest.main(FormatTest.java:9)
刚学习java,找了很长时间了,不知道错哪里了?

解决方案 »

  1.   

    代码如下:
    package formattest;import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.text.DateFormat;
    import java.text.NumberFormat;
    import java.util.Date;import javax.swing.JButton;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.text.DefaultFormatter;
    import javax.swing.text.DocumentFilter;
    import javax.swing.text.InternationalFormatter;
    import javax.swing.text.MaskFormatter;
    import java.lang.reflect.Array;
    import java.lang.Object;
    import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;public class FormatTestFrame extends JFrame
    {
          public FormatTestFrame()
          {
           setTitle("FormatTest");
           setSize(WIDTH,HEIGHT);
           
           JPanel buttonPanel = new JPanel();
           okButton = new JButton("ok");
           buttonPanel.add(okButton);
           add(buttonPanel,BorderLayout.SOUTH);
           
           mainPanel = new JPanel();
           mainPanel.setLayout(new GridLayout(0,3));
           add(mainPanel,BorderLayout.CENTER);
           
           JFormattedTextField intField = new JFormattedTextField(NumberFormat.getIntegerInstance());
           intField.setValue(new Integer(100));
           addRow("Number:",intField);
           
           
           JFormattedTextField intField2 = new JFormattedTextField(NumberFormat.getIntegerInstance());
           intField2.setValue(new Integer(100));
           intField2.setFocusLostBehavior(JFormattedTextField.COMMIT);
           addRow("Number (Commit behavior):",intField2);
           
         //安装格式器产生想要的过滤器的程序
           JFormattedTextField intField3
             = new JFormattedTextField(new
              InternationalFormatter(NumberFormat.getIntegerInstance())
             {
              protected DocumentFilter getDocumentFilter()
              {
              return filter;
              }
              private DocumentFilter filter = new IntFilter();
             });
           intField3.setValue(new Integer(100));
           addRow("Filtered Number",intField3);
           
           JFormattedTextField intField4 = new JFormattedTextField(NumberFormat.getIntegerInstance());
           intField4.setValue(new Integer(100));
           intField4.setInputVerifier(new FormattedTextFieldVerifier());
           addRow("Verified Number:",intField4);
           
           JFormattedTextField currencyField
                = new JFormattedTextField(NumberFormat.getCurrencyInstance());
           currencyField.setValue(new Double(10));
           addRow("Currency:",currencyField);
           
           JFormattedTextField dateField  = new JFormattedTextField(DateFormat.getDateInstance());
           dateField.setValue(new Date());
           addRow("Date (default):",dateField);
           
        
           DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT);
           format.setLenient(false);
           JFormattedTextField dateField2 = new JFormattedTextField(format);
           dateField2.setValue(new Date());
           addRow("Date(short,not lenient):",dateField2);
           
           try
           {
           DefaultFormatter formatter = new DefaultFormatter();  
           formatter.setOverwriteMode(false);
           JFormattedTextField urlField = new JFormattedTextField(formatter);
           urlField.setValue(new URL("http://java.sun.com"));
           addRow("URL:",urlField);
           }
           catch (MalformedURLException e)
           {
           e.printStackTrace();
           }      
           try
           {
           MaskFormatter formatter = new MaskFormatter("###-##-####");
           formatter.setPlaceholderCharacter('0');
           JFormattedTextField ssnField = new JFormattedTextField(formatter);
           ssnField.setValue("078-05-1120");
           addRow("SSN Mask:",ssnField);
           }
           catch(java.text.ParseException exception)
           {
           exception.printStackTrace();     
           } 
           
           JFormattedTextField ipField = new JFormattedTextField(new IPAddressFormatter());
           ipField.setValue(new byte[] {(byte) 130,65,86,66});
           addRow("IP Address:",ipField);
           
          }
          
          public void addRow(String labelText,final JFormattedTextField field)
          {
           mainPanel.add(new JLabel(labelText));
           mainPanel.add(field);
           final JLabel valueLabel = new JLabel();
           mainPanel.add(valueLabel);
           okButton.addActionListener(new
              ActionListener()
                {
                  public void actionPerformed(ActionEvent event)
                  {
                   Object value = field.getValue();
                   if(value.getClass().isArray())
                   {
                   StringBuilder builder = new StringBuilder();
                   builder.append('{');
                   for(int i=0;i<Array.getLength(value);i++)
                   {
                   if(i>0) builder.append(',');
                   builder.append(Array.get(value,i).toString());
                   }
                   builder.append('}');
                   valueLabel.setText(builder.toString());            
                   }
                   else
                   valueLabel.setText(value.toString());
                  }      
                });
          }
      public static final int WIDTH = 500;
      public static final int HEIGHT = 250;
      
      private JButton okButton;
      private JPanel mainPanel;}
    package formattest;import java.util.StringTokenizer;import javax.swing.text.DefaultFormatter;import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;public class IPAddressFormatter extends DefaultFormatter
    {
    public String valueToString(Object value)
       throws ParseException
    {
    if(!(value instanceof byte[]))
    throw new ParseException("Not a byte[]",0);
    byte[] a =(byte[]) value;
    if(a.length !=4)
    throw new ParseException("Length !=4",0);
    StringBuilder builder = new StringBuilder();
    for(int i =0;i<4;i++)
    {
    int b = a[i];
    if(b<0) b += 256;
    builder.append(String.valueOf(b));
    if(i<3) builder.append('.');
    }
    return builder.toString();
    }

    public Object stringToValue(String text) throws ParseException
    {
    StringTokenizer tokenizer= new StringTokenizer(text,".");
    byte[] a = new byte[4];
    for(int i =0;i<4;i++)
    {
    int b = 0;
    if(!tokenizer.hasMoreTokens())
    throw new ParseException("Too few bytes",0);
    try
    {
    b = Integer.parseInt(tokenizer.nextToken());
    }
    catch(NumberFormatException e)
    {
    throw new ParseException("Not an integer",0);
    }
    if(b<0 || b>=256)
    throw new ParseException("Byte out of range",0);
    a[i] = (byte) b;
    }
    if (tokenizer.hasMoreTokens())
       throw new ParseException("Too many bytes",0);
    return a;
    }
    }这是其中的一部分代码,不知问题是否出在这两个java文件中?
      

  2.   

    ParseException这个异常应该是:java.text.ParseExceptionimport com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
    这个可能是作者自己写的。