6

24 時間のみを受け入れる JFormattedTextField を作成しようとしています。

私は解決策に非常に近づいていますが、次のコード例が機能しないケースが 1 つあります。

時刻「222」を入力してフィールドからフォーカスを変更すると、時刻が「2202」に修正されます。完全な 4 桁の 24 時間制のみを受け入れるようにしたいと思います。このコードは、先ほど述べたものを除いて、ほとんどすべての場合で思いどおりに機能します。助言がありますか?

    public static void main(String[] args) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("HHmm");
        dateFormat.setLenient(false);

        DateFormatter dateFormatter =  new DateFormatter(dateFormat);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JFormattedTextField textField = new JFormattedTextField(dateFormatter);
        frame.add(textField, BorderLayout.NORTH);

        frame.add(new JTextField("This is here so you can change focus."), BorderLayout.SOUTH);
        frame.setSize(250, 100);
        frame.setVisible(true);
    }
4

2 に答える 2

5

他の人が述べたように、あなたの最善の策は、おそらく入力文字列の長さを検証することです。SimpleDateFormat私が好むアプローチは、すべての解析ロジックを 1 か所に保持するサブクラス化です。

public class LengthCheckingDateFormat extends SimpleDateFormat {

  public LengthCheckingDateFormat(String pattern) { super(pattern); }

  @Override
  public Date parse(String s, ParsePosition p) {
    if (s == null || (s.length() - p.getIndex()) < toPattern().length()) {
      p.setErrorIndex(p.getIndex());
      return null;
    }
    return super.parse(s, p);
  }
}
于 2012-06-15T13:37:55.793 に答える
2

DateFormatter「ほぼ」すべてのトリックを行うように見えるので、私は疑問に思います。

Stringしたがって、入力されたすべての短すぎる s を empty として扱うために、最終的な検証と書式設定を行うメソッド one をオーバーライドしてみませんかString

        DateFormatter dateFormatter = new DateFormatter(dateFormat) {
            @Override
            public Object stringToValue(String text) throws ParseException {
                if(!getFormattedTextField().hasFocus())
                    if (text.length() != 4) {
                        return null;
                    }
                return super.stringToValue(text);
            }            
        };

編集:

@nIcE cOw が示唆するように、最も簡単なのは、フォーカスが失われたときにそれを提供することです。

    final JFormattedTextField textField = new JFormattedTextField(dateFormatter);
    textField.addFocusListener(new FocusAdapter() {
        @Override
        public void focusLost(FocusEvent e) {
            super.focusLost(e);
            if(textField.getText().length() != 4)
                textField.setText("");
        }
    });
于 2012-06-15T13:26:50.130 に答える