0

我有一个使用代码初始化的 JFormattedTextField

JFormattedTextField f = new JFormattedTextField(createFormatter());
f.setValue(null);
f.setColumns(1);
f.setEditable(true);
f.setCaretPosition(0);

textField 为 1 列宽,在我的 createFormatter 方法中

MaskFormatter formatter = null;
    try {
        formatter = new MaskFormatter("#");
        formatter.setValidCharacters("123456789");
    } catch (java.text.ParseException exc) {
        System.err.println("formatter is bad: " + exc.getMessage());
        System.exit(-1);
    }
    return (formatter);

如您所见,我只想在文本字段中输入数字 1-9。这在切换到文本字段时效果很好,但是当我实际单击文本字段进行输入时,光标会发生这种奇怪的事情。

此处光标闪烁空白... 光标闪烁白色 并且光标闪烁黑色。 光标闪烁黑色

如您所见,左上角有一个小黑点,光标从左侧移开。我可以突出显示左侧的区域,高亮区域并且不能再向该文本字段添加任何字符(即使是数字 1-9)。这让我相信,当我用光标关注文本字段时,正在添加一个字符。我不知道这个角色是什么,我不知道如何解决这个问题。

有谁知道如何解决这个问题?

这是一个sscce

public class FormattedTextField {

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(100, 75);
    JPanel content = new JPanel(new FlowLayout());
    frame.setContentPane(content);

    JFormattedTextField f1 = new JFormattedTextField(createFormatter());
    f1.setValue(null);
    f1.setColumns(1);

    JFormattedTextField f2 = new JFormattedTextField(createFormatter());
    f2.setValue(null);
    f2.setColumns(1);

    content.add(f1);
    content.add(f2);

    frame.setVisible(true);
}

public static MaskFormatter createFormatter() {
    MaskFormatter formatter = null;
    try {
        formatter = new MaskFormatter("#");
        formatter.setValidCharacters("123456789");
    } catch (java.text.ParseException exc) {
        System.err.println("formatter is bad: " + exc.getMessage());
        System.exit(-1);
    }
    return (formatter);
}

}

在这个例子中,左上角没有一个小黑点,但是当用鼠标聚焦文本字段时,仍然添加了一个空白字符。

4

1 回答 1

3

在我的带有 JDK7 的 Mac 上,我的代码只会出现烦人的插入符号行为。我没有看到那个点。

从 a 切换MaskFormatter到 aFormat似乎可以解决这个问题。我对 s 的个人经验JFormattedTextField总是与Format似乎有效的 a 结合使用(经过一些小调整,请参阅这篇文章)。

无论如何,这里是您的 SSCCE 的调整版本,它使用Format

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.text.MaskFormatter;
import java.awt.FlowLayout;
import java.text.AttributedCharacterIterator;
import java.text.FieldPosition;
import java.text.Format;
import java.text.NumberFormat;
import java.text.ParsePosition;

public class FormattedTextFieldDemo {
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(100, 75);
    JPanel content = new JPanel(new FlowLayout());
    frame.setContentPane(content);

    JFormattedTextField f1 = new JFormattedTextField(createFormat());
    f1.setValue(null);
    f1.setColumns(1);

    JFormattedTextField f2 = new JFormattedTextField(createFormat());
    f2.setValue(null);
    f2.setColumns(1);

    content.add(f1);
    content.add(f2);

    JFormattedTextField f3 = new JFormattedTextField(createFormatter());
    f3.setValue(null);
    f3.setColumns( 1 );

    JFormattedTextField f4 = new JFormattedTextField(createFormatter());
    f4.setValue(null);
    f4.setColumns(1);

    content.add(f3);
    content.add(f4);

    frame.setVisible(true);
  }

  private static MaskFormatter createFormatter() {
    MaskFormatter formatter = null;
    try {
      formatter = new MaskFormatter("#");
      formatter.setValidCharacters("123456789");
    } catch (java.text.ParseException exc) {
      System.err.println("formatter is bad: " + exc.getMessage());
      System.exit(-1);
    }
    return (formatter);
  }

  private static Format createFormat(){
    final NumberFormat format = NumberFormat.getInstance();
    format.setParseIntegerOnly( true );
    return new Format() {
      @Override
      public StringBuffer format( Object obj, StringBuffer toAppendTo, FieldPosition pos ) {
        return format.format( obj, toAppendTo, pos );
      }

      @Override
      public AttributedCharacterIterator formatToCharacterIterator( Object obj ) {
        return format.formatToCharacterIterator( obj );
      }


      @Override
      public Object parseObject( String source, ParsePosition pos ) {
        int initialIndex = pos.getIndex();
        Object result = format.parseObject( source, pos );
        if ( result != null && pos.getIndex() > initialIndex + 1 ) {
          int errorIndex = initialIndex + 1;
          pos.setIndex( initialIndex );
          pos.setErrorIndex( errorIndex );
          return null;
        }
        return result;
      }
    };
  }
}
于 2012-11-21T07:38:52.693 回答