2017-02-15 5 views
0

テキストフィールドに入力された内容が英数字ではなく数字のみであることを確認しようとしています。私はフォーマットされたテキストボックスを調べましたが、チュートリアルのオラクルが自分のサイトに持っている理解の不足のため、それらを実装することができませんでした。私はいくつかの検索をして、キーリスナークラスを見つけました。そして、それは最良の選択肢のようでした。キーリスナーを使用してテキストフィールドへの入力を確認する方法

私はプログラムを実行し、文字のイベントを消費するのではなく、テキストフィールドに入力すると、私にビープ音が鳴ります。ここでは、コードがあります:ここでは

private void buildPanel() 
{ 
    // Create a label to display instructions. 
    messageLabel = new JLabel("Enter a time in seconds the object has fallen"); 

    // Create a text field 10 characters wide 
    fallingTextField = new JTextField(10); 

    // Add a keylistener to the text field 
    fallingTextField.addKeyListener(new TextFieldListener()); 

    // Create a button with the caption "Calculate" 
    calcButton = new JButton("Calcualte"); 

    // Add an action listener to the button 
    calcButton.addActionListener(new CalcButtonListener()); 

    //Create a JPanel object and let the panel field reference it 
    panel = new JPanel(); 

    // Add the label, text field, and button components to the panel 
    panel.add(messageLabel); 
    panel.add(fallingTextField); 
    panel.add(calcButton); 
} 

/** 
    The TextFieldListener class checks to see if a valid key input is typed into 
    the text field. 
*/ 
private class TextFieldListener implements KeyListener 
{ 
    /** 
     The keyPressed method 
     @param evt is a key event that verifies a number is inputed otherwise 
     the event is consumed. 
    */ 
    public void keyPressed(KeyEvent evt) 
    { 
     char c = evt.getKeyChar(); 
     if(Character.isAlphabetic(c)) 
     { 
      getToolkit().beep(); 
      evt.consume(); 
     } 
    } 
    public void keyReleased(KeyEvent e) 
    { 

    } 
    public void keyTyped(KeyEvent ev) 
    { 

    } 
} 
+1

ドンあなたは次のように、最後の文字なしでフィールドの値を設定する必要があります'KeyListener'を使用しないでください。代わりに' KeyListener'を使用してください。 'DocumentFilter'を使用してください。それは – MadProgrammer

+0

のために設計されたものです。それをあきらめないでください。ちょうどそのことを読んで、どのように使用するかを学んでください。あなたが見ると、あなたは問題に遭遇し、あきらめることに決めました。それをしないでください。あなたは**パズルを解決することによってプログラミングを学びます。別のものを交換するのではなく... – GhostCat

+0

ユーザーがテキストをフィールドに貼り付けるとどうなりますか? (ヒントなし) – MadProgrammer

答えて

2

if(Character.isAlphabetic(c)) 
    { 
     getToolkit().beep(); 

あなたはアルファベットの文字を入力するたびにビープ音が鳴り、あなたのリスナーに伝えます。あなたがそれをするとき、それはビープ音です。

コードとまったく同じ働きをするすべてのコードは、それが必要であることを示します。

質問の他の部分については、 consume()(InputEventから継承されています)のJavadocをチェックしてください。

このイベントは、元のソースによってデフォルトの方法で処理されないように消化します。

ソースにはありません。イベントはすでに作成され、リスナーにディスパッチされています。あなたの文脈でconsume()と呼んでください...単にこれ以上何もしません。多かれ少なかれ「ノーオペ」です。

キーボード入力を待つコードを書きましたが、入力がアルファベットの場合はのときはとなり、ビープ音が鳴ります。つまり、あなたのコードが行うすべてです。私はあなたが "/"を提供すると仮定します。何も起こらないでしょう。 を検証したい場合は、 "フィードバック"ループが必要です。たとえば、不正な入力を検出したときにリスナーがテキストフィールドの内容を上書きする可能性があります。

+0

私はevt.consume()を持っています。 getToolKit()。beep()の下でビープ音だけを鳴らしますか? キーの入力が間違っていることをユーザーに知らせてから、イベントを消費するようにするのがビープ音であると考えました。 –

+0

更新情報を見る – GhostCat

1

問題は、イベントが処理されるまでに文字が既に追加されていることだと思います。あなたはOracleサイトでの例を使用して、次のように、マスクの入力を使用することができ、また

fallingTextField.setValue(fallingTextField.getValue().substring(0, fallingTextField.getValue().length - 1)) 

zipField = new JFormattedTextField(
        createFormatter("#####")); 
... 
protected MaskFormatter createFormatter(String s) { 
    MaskFormatter formatter = null; 
    try { 
     formatter = new MaskFormatter(s); 
    } catch (java.text.ParseException exc) { 
     System.err.println("formatter is bad: " + exc.getMessage()); 
     System.exit(-1); 
    } 
    return formatter; 
} 
+0

ありがとうマスキングチュートリアルを再読み込みします。オラクルはこれまでに示したことを実装する方法を理解できるかどうかを確認します。チュートリアルのリンクは –

+0

(1+)です。この問題を解決するだけでなく、このチュートリアルをすべてのSwingの基礎として参考にすることができます。 – camickr

関連する問題