1

次のマスクフォーマッタを使用した JFormattedTextField があります。

    private MaskFormatter maskForInput;
    maskForInput=new MaskFormatter("####"); // I have tried using stars (*) too.
    maskForInput.setValidCharacters("0123456789");

    javax.swing.JFormattedTextField playerRaiseField=new javax.swing.JFormattedTextField(maskForInput);

これは、ユーザーが入力として最大 4 桁を入力できるようにするためのものです。ただし、このフィールドから返されようとするとInteger.parseInt(playerRaiseField.getText())、ユーザー入力に空のスペースが残っている可能性があるためString、常に取得しています。NumberFormatExceptionこれをクリアするには:

たとえば、ユーザーが入力560した場合、末尾にスペースが残っているため、私が読んでいる文字列はあり、これを560( )this に解析しようとすると例外がスローされます。回避策はありますか?常に 4 桁固定ではなく、1 ~ 4 桁を受け入れるようにマスク フォーマッタを変更するにはどうすればよいですか??Stringint

注:不思議なことtrim()に、String返されたを使用しても余分な空白文字は削除されません...

4

4 に答える 4

2

ご期待に添えない点が多々ありますが…

まず、フォーマットされたフィールドには任意の数の文字を含めることができると信じているようです。これは正しくありません (テキストは取得できますが、フィールドは無効な状態と見なされたままになります)。フォーマットされたフィールドは、マスクのすべての場所を埋める必要があることを想定しています。

次に、JFormattedTextField#getValueメソッドを使用してフィールドの値を返す必要があります。getText

第三に、返されるテキストはマスクのプレースホルダー文字 ( MaskFormatter#getPlaceholder) で埋められます。これはスペースである場合とそうでない場合があるため、String#trimおそらく役に立たないでしょう...

ユーザーが 0 ~ n 文字で構成される数値のみを入力できるようにしたい場合は、DocumentFilter法線に適用されるを使用することを検討する必要があります。JTextField

public class TestField {

    public static void main(String[] args) {
        new TestField();
    }

    public TestField() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class NumericDocumentFilter extends DocumentFilter {

        private int maxChars;

        public NumericDocumentFilter(int maxChars) {
            this.maxChars = maxChars;
        }

        @Override
        public void insertString(DocumentFilter.FilterBypass fb, int offset,
                String text, AttributeSet attr)
                throws BadLocationException {

            StringBuilder buffer = new StringBuilder(text);
            for (int i = buffer.length() - 1; i >= 0; i--) {
                char ch = buffer.charAt(i);
                if (!Character.isDigit(ch)) {
                    buffer.deleteCharAt(i);
                }
            }

            text = buffer.toString();
            if (fb.getDocument().getLength() + text.length() > maxChars) {
                int remaining = maxChars - fb.getDocument().getLength();
                text = text.substring(0, remaining);
            }

            if (text.length() > 0) {
                super.insertString(fb, offset, text, attr);
            }
        }

        @Override
        public void replace(DocumentFilter.FilterBypass fb,
                int offset, int length, String string, AttributeSet attr) throws BadLocationException {
            if (length > 0) {
                fb.remove(offset, length);
            }
            insertString(fb, offset, string, attr);
        }
    }

    public class TestPane extends JPanel {

        private JTextField field;

        public TestPane() {

            setLayout(new GridBagLayout());

            field = new JTextField(4);
            ((AbstractDocument) field.getDocument()).setDocumentFilter(new NumericDocumentFilter(4));
            add(field);
            field.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println(field.getText());
                }
            });
        }
    }
}
于 2013-01-22T03:17:38.647 に答える
0

Javaドキュメント

1

public void setMask(String mask)
             throws ParseException

24つの空白スペースがあると言います。これは、デフォルト値が設定されておらず、無効な文字を使用していないことを意味します。上記のドキュメントを調べてください。

3スケーラブル(1〜4)にするには、入力の長さを決定してから、IFを使用して適切なマスクを実行する必要があります。残りのマスクをデフォルト値で埋めることもできます。ドキュメントを参照してください。

編集:あなたが以下にもっとコードを投稿したのを見てください。既存の文字列に対してgetTextを実行しません。これを使用して、フィールドから入力を取得します。あなたは別の方法でそれをしなければなりません。

于 2013-01-22T02:09:31.127 に答える
0

「####」の形式では、正確に4桁しか使用できません。可変長の場合、カスタムクラスを作成する必要があります。これがクラスの例です。

私はあなたのコードを使用して何かを実装しました、そしてそれは4つの数字すべてが記入されたときだけ私のために働きました:

import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.*;
import java.awt.*;
public class tes implements ActionListener
{
  public static JFormattedTextField playerRaiseField;
public static void main(String[] args) throws Exception{
JFrame j=new JFrame();
    j.setSize(400,400);
    j.setLayout(new GridLayout(2,1));

MaskFormatter maskForInput;
    maskForInput=new MaskFormatter("####"); // I have tried using stars (*) too.
    maskForInput.setValidCharacters("0123456789");

    playerRaiseField=new javax.swing.JFormattedTextField(maskForInput);
j.getContentPane().add(playerRaiseField);
JButton jb=new JButton("Print out the above value");
j.getContentPane().add(jb);
jb.addActionListener(new tes());
j.setVisible(true);
}
public void actionPerformed(ActionEvent e) throws Exception{
    System.out.println("\""+Integer.parseInt(playerRaiseField.getText())+"\"");
}
}
于 2013-01-22T02:12:11.127 に答える
0

トリムの使用方法がわからないため、次のコード行を試してスペースを削除することをお勧めします: 説明したように、次のコードが機能するはずです:

String playerBet=playerRaiseField.getText();
// if playerBet is not null
String playerBetWithoutSpaces=playerBet.trim();

Integer.parseInt(playerBetWithoutSpaces);
于 2013-01-22T01:51:17.173 に答える