2012-01-21 5 views
8

1秒に1回、データベースから文字列のセットを取得し、それらの文字列をJComboBoxの内容に設定し、そのうちの1つを現在選択されている値に設定するJComboBoxがあります。しかし、ユーザーがJComboBoxを編集してデータベースに値を追加し、それを現在の値として設定できるようにしたいと考えています。JComboBoxの編集を検出する

JComboBoxに文字が入力されたことを検出できるようにするため、JComboBoxがゼロでない限り、カウントダウンをリセットしてJComboBoxを更新できないようにします。私の最初の本能はのKeyListenerを使用していたが、コンボボックス上のJavaチュートリアルがこれを言う、

JComboBoxが 低レベルイベントのリスナー登録する方法を継承しますが

- 例えば、フォーカス、キー、およびマウスイベントを - 私たち では、コンボボックスで低レベルのイベントを待機しないことをお勧めします。

また、ルックアンドフィールによって発生するイベントが変わる可能性があります。

+0

このような質問が大好きです。スイングは興味深いフレームワークであり、適切に使用することは、奇妙ではあるが実行可能な一連のハッキングを知らないことよりも頻繁に起こります。 :) –

答えて

4

これはちょっと面倒ですが、エディタコンポーネント(AJTextField)でドキュメントの更新を聞くには有効です。

JComboBox cb = new JComboBox(); 
    Component editor = cb.getEditor().getEditorComponent(); 
    if (editor instanceof JTextField) { 
     ((JTextField) editor).getDocument().addDocumentListener(new DocumentListener() { 
      @Override 
      public void insertUpdate(DocumentEvent documentEvent) { 
       //To change body of implemented methods use File | Settings | File Templates. 
      } 

      @Override 
      public void removeUpdate(DocumentEvent documentEvent) { 
       //To change body of implemented methods use File | Settings | File Templates. 
      } 

      @Override 
      public void changedUpdate(DocumentEvent documentEvent) { 
       //To change body of implemented methods use File | Settings | File Templates. 
      } 
     });          
    } 

これらのUpdate(DocumentEvent documentEvent)メソッドは、JComboBoxから型付き/削除されたすべての文字に対して呼び出される必要があります。

2

私は、changedUpdateメソッドがプレーンテキストドキュメントの通知を発行しないことを追加したいと思います。プレーンテキストのテキストコンポーネントを使用している場合は、insertUpdateおよび/またはremoveUpdateを使用する必要があります。

最近、ユーザーがコンボボックスを編集しているときにボタンを無効/有効にする方法としてドキュメントリスナーを使用する必要がありました。私はこのような何かをしたし、非常によく働いた:コンボボックスに関連付けられた文書は、プレーンテキストであるため、この作品

((JTextComponent) combobox.getEditor().getEditorComponent()) 
    .getDocument().addDocumentListener(new MyDocumentListener()); 

public class MyDocumentListener implements DocumentListener 
{ 

    @Override 
    public void insertUpdate(DocumentEvent e) 
    { 
    setChanged(); 
    notifyObservers(true); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) 
    { 
    setChanged(); 
    notifyObservers(false); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) 
    { 
    // Not used when document is plain text 
    } 
} 

をその後、私はこのようなコンボボックスにこのリスナーを追加しました。私がchangedUpdateを使用したとき、それはそうしなかった。

関連する問題