2016-11-23 6 views
3

私はJTextAreaをinputといい、上矢印キーを押したときにinputValueの文字列を読み込もうとしています。これまでのところ、このコードは機能していないように見えますが、私はなぜそれがわかりません。助けてください。JtextAreaにキーリスナーを追加する

input.addKeyListener(new KeyListener() {    
     public void keyTyped(KeyEvent e) { 
      System.out.println("test"); 
      if(e.getKeyCode() == KeyEvent.VK_UP) { 
       input.setText(inputValue); 
       System.out.println("up is pressed"); 
      }  
     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub  
     } 
    }); 
+0

SwingのテキストコンポーネントでKeyListenerを使用しないでください。コンポーネントのネイティブ関数を混乱させる可能性があるためです。 DocumentListeners、DocumentFilters、およびKey Bindingsの使用を含め、これらのコンポーネントでキー押下をトラップする方がはるかに優れています。 –

答えて

2

それはJTextAreasのようなSwingテキストコンポーネント上KeyListenersのような低レベルのリスナーを使用するときは注意する必要がありcaracter

5

ではありませんので、あなたがするので、keypressed、ボイドの代わり

@Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println("test"); 
      if(e.getKeyCode() == KeyEvent.VK_UP) { 
       input.setText(inputValue); 
       System.out.println("up is pressed"); 

     } 

keyTypedにオーバーライドする必要がありますこれらを混乱させると、テキストコンポーネントが誤動作する可能性があります。

ドキュメントへの変更を探している場合はDocumentListenerを使用し、の前にテキスト入力を受信して​​ブロックまたは変更する場合は、DocumentFilterを使用する方がずっと優れています。

上矢印などの通知を受けたい場合は、Key Bindingsを使用します.JTextAreaがキープレスに通知して反応するために使用し、キーバインディングを新しいものこれを慎重に行うと、新しいアクションのキープレスに関連付けられた元のアクションを呼び出すことさえできます。たとえば、

import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class TextAreaTrapUp extends JPanel { 
    private JTextArea textArea = new JTextArea(20, 40); 

    public TextAreaTrapUp() { 
     // get JTextArea's InputMap and ActionMap 
     int condition = JComponent.WHEN_FOCUSED; 
     InputMap inputMap = textArea.getInputMap(condition); 
     ActionMap actionMap = textArea.getActionMap(); 

     // get the up keystroke 
     KeyStroke upKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); 
     String upKey = (String) inputMap.get(upKeyStroke); // get the input map's key for this keystorke 
     Action originalUpAction = actionMap.get(upKey); // and get the action map's original action for this key 

     Action newUpAction = new NewUpAction(originalUpAction); // create our new up action passing in the old one 
     actionMap.put(upKey, newUpAction); // and set this into our ActionMap 

     textArea.setWrapStyleWord(true); 
     textArea.setLineWrap(true); 
     add(new JScrollPane(textArea)); 
    } 

    // Action called when up-arrow pressed 
    private class NewUpAction extends AbstractAction { 
     private Action originalUpAction; // the original action 

     public NewUpAction(Action originalUpAction) { 
      this.originalUpAction = originalUpAction; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Up Arrow Pressed"); 

      // if you want to move the caret up, then call the original action 
      // as well 
      if (originalUpAction != null) { 
       originalUpAction.actionPerformed(e); 
      } 
     } 
    } 

    private static void createAndShowGui() { 
     TextAreaTrapUp mainPanel = new TextAreaTrapUp(); 

     JFrame frame = new JFrame("TextAreaTrapUp"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

スイングコンポーネントでアクションリスナーを使用すると、以前にこの問題が発生しました。グリッドを整理するためにスレッドロックを使用して終了しましたが、これは長期的にはうまくいったかもしれないと思います。しかたがない。 – CNorlander

+0

@CNorlander:あなたの最後のコメントを理解しているかどうかはわかりません。しかし質問:JTextArea内で上向き矢印の印刷機をトラップしているのはなぜですか?それはやや珍しい要件ですか?そして、あなたは上向き矢印が機能するようにしたいですか?キャレットを動かすには?そして、少しだけ考えてみましょう:皆さんを助けようと努力しているすべての回答を投票することを検討してください。 –

+0

テキストエリアはテキストアドベンチャーゲームの入力に使用され、ユーザーからの入力が望ましくない場合は無効になります。私はフィールドが有効になっていないときにユーザーがこの上矢印コマンドを使用できるようにしたくありません。上向き矢印キーは通常の機能を実行する必要はありません。 – CNorlander

関連する問題