2017-10-17 5 views
0

(JTextAreaからの)ユーザーからのテキスト入力を取得し、既存のリストに基づいて自動補完を使用したいと思います。JTextAreaにKeyEventListenerを使用し、Tabを使用してリストから単語を自動補完する方法

など。ユーザーは 'London Vict'と入力してTabキーを押すとロンドンビクトリア(これはリストに含まれる)に入力されます。

私は、ユーザーのテキストを取り戻すのに苦労しています。私はJTextAreaにKeyEventListenerを追加しようとしましたが、運がありませんでした。

以下のコードを見つけてください:

package Main; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.KeyListener; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Map; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.Document; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JTextPane; 
import javax.swing.JTextArea; 

public class View extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 

    Map.Entry<String, List<Integer> > entry = new MyEntry<String, List<Integer> >("London Victoria", new ArrayList<Integer>(Arrays.asList(1, 2))); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        View frame = new View(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public View() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JTextArea StationDetails = new JTextArea(); 
     StationDetails.setText("Enter Undergound Name: "); 
     StationDetails.setBounds(35, 19, 382, 232); 
     //StationDetails.getDocument().addDocumentListener(new DocumentListener); 
     contentPane.add(StationDetails); 
    } 

    final class MyEntry<K, V> implements Map.Entry<K, V> { 
     private final K key; 
     private V value; 

     public MyEntry(K key, V value) { 
      this.key = key; 
      this.value = value; 
     } 

     @Override 
     public K getKey() { 
      return key; 
     } 

     @Override 
     public V getValue() { 
      return value; 
     } 

     @Override 
     public V setValue(V value) { 
      V old = this.value; 
      this.value = value; 
      return old; 
     } 
    } 

} 

すべての局名が含まれているリストは、「エントリ」は任意の助けすべての

+0

キーイベントリスナーと何か運がないのはどういう意味ですか? KeyMapの作成を見たいかもしれませんが、イベントリスナーと似たようなことがありますが、おそらくもっとうまくいくでしょう。 – matt

答えて

2

まずため

おかげと呼ばれ、変数名はべきではありません大文字で始まります。ほとんどが正しいが、すべてではない。一貫してください!

ユーザーは

SwingコンポーネントがKeyStrokeActionをマップするためにKey Bindingsを使用して 'ロンドンVict' を入力し、Tabキーを押します。

いくつかの基本については、Swing tutorialをお読みください。上のセクションがあります

  1. がキーバインディングを使用する方法
  2. はアクション
  3. を使用する方法は

あなたのキーのようなものになり、コードを結合:

JTextArea textArea = new JTextArea(3, 30); 
InputMap im = textArea.getInputMap(); 
KeyStroke tab = KeyStroke.getKeyStroke("TAB"); 
textArea.getActionMap().put(im.get(tab), new TabAction(true)); 

をそして、あなたのTabActionは次のようになります次のようなもの:

class TabAction extends AbstractAction 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     JTextArea textArea = (JTextArea)e.getSource(); 

     // get the word at the caret 
     // lookup the full word 
     // replace current text with full word 
    } 
} 

Utilitiesクラスを使用すると、置換するテキストの開始オフセットを取得し、その単語を検索した後にJTextAreaのreplaceSelectionメソッドを使用して置換することができます。

関連する問題