2016-12-12 10 views
0

JComboBoxを拡張するクラス(UIPromptComboBox)を作成しています。コンボボックスは編集可能であり、クラスの1つのアプリケーションに対しては、コントロールActionListenerで実装されています。編集可能なJComboBoxがフォーカスを失うとActionListenerを発する

現在のところ、コンボボックスを編集すると、それは良いですActionListenerを発生させます。しかし、このActionListenerは、コンボボックスの選択を解除したときにも起動されます。コンボボックスが選択解除されても、2つのイベントを区別することはできません。複数のオブジェクトを引き起こしている原因のフォーカスを失うことにするJComboBox

public class UIPromptComboBox extends JComboBox { 

    public UIPromptComboBox(UIPrompt[] items) { 
     super(items); 
     this.setEditable(true); 
    } 

    public UIPromptComboBox() { 
     this.setEditable(true); 
     this.setEnabled(false); 
    } 

    /** 
    * returns either the selected UI prompt or a new prompt using the example 
    * text 
    * 
    * @param exampleText only used if new prompt is created 
    * @return UI prompt selected 
    */ 
    public UIPrompt getUIPrompt(String exampleText) { 
     UIPrompt uIPrompt = null; 
     Object returnedItem = this.getSelectedItem(); 
     if (returnedItem instanceof UIPrompt) { 
      uIPrompt = (UIPrompt) returnedItem; 
     } else if (returnedItem instanceof String) { 
      uIPrompt = new UIPrompt((String) returnedItem, exampleText); 
     } 
     return uIPrompt; 
    } 

    public void addNewUIPrompt(UIPrompt newPrompt) { 
     ActionListener[] actionListerners = this.getActionListeners(); 

     this.removeActionListener(this); 
     this.addItem(newPrompt); 
     this.setSelectedItem(newPrompt); 

     for (ActionListener al : actionListerners) { 
      this.addActionListener(al); 
     } 

    } 

    /** 
    * Used for displaying a report value sentence 
    * i.e. a string that is not associated with UI Prompts 
    * @param newText report value sentence 
    */ 
    public void setText(String newText) { 
     this.removeAllItems(); 
     this.addItem(newText); 
     this.setSelectedItem(newText); 
    } 

    /** 
    * For when the UI prompts can be added on construction 
    * 
    * @param currentUIs list of UI promts 
    */ 
    public void addItems(UIPrompt[] currentUIs) { 
     this.removeAllItems(); 
     DefaultComboBoxModel boxModel = new DefaultComboBoxModel(currentUIs); 
     this.setModel(boxModel); 
    } 

} 

複数の発射を拡張

実装するクラス

private void addUIField() { 
     // Initialise and place combobox 
     this.myGuiTextField = new UIPromptComboBox(); 
     myGuiTextField.setSize(COMBO_WIDTH, defaultHeight); 
     GuiUtils.positionControl(myPanel, myGuiTextField, myTop, PROMPT_X_LOC); 

     //Add action listener 
     myGuiTextField.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent evt) { 
       if (evt.getActionCommand().equals("comboBoxEdited")) { 
        newUIcreated((UIPromptComboBox) evt.getSource()); 
       } 
      } 

      private void newUIcreated(UIPromptComboBox alteredGuiTextField) { 
       try { 
        UIPrompt uip = alteredGuiTextField.getUIPrompt(((PowerPointTextItem) myPPTRef).getValue()); 
        if (!simInfo.isInPrompts(uip)) { 
         simInfo.addUIPrompt(uip); 
         alteredGuiTextField.addNewUIPrompt(uip); 
        } 
       } catch (MissingPowerpointItem ex) { 
        Exceptions.printStackTrace(ex); 
       } 
      } 
     }); 
    } 

クラスが作成され、リストに追加されます。私はActionListenerを正しく実装していない可能性があります。あなたの助けをありがとう

+0

コンボボックスの選択を解除すると、イベントを起動するだけで大​​丈夫ですか?今私は正確に何が起こるべきか、起こっていることを理解していませんでした – XtremeBaumer

+0

@XtremeBaumer、私の質問を読んでくれてありがとう。 私は、コンボボックスを編集した後、ユーザーがEnterキーを押したときに、選択を解除するのではなく、起動することをお勧めします。現在のところ、問題は、入力が押されたときと、別のコンボボックスが選択されたときに発火して、コードがかなりの回数繰り返されることです。 – emmistar

答えて

0

私は今問題を発見しました。

UIPromptの表示には、時には改行文字が含まれていた文字列の追加が含まれていました。

他のフィールドをクリックすると、UIPromptのレンダリングがトリガされましたが、これに改行文字が含まれていたときに再びActionListenerがトリガされました。これはcomboBoxEditedの繰り返し動作の理由です。

0

あなたがあなたがenterを押した場合にのみイベントを発生させたいと述べたので、それを実装するより良い方法は、アクションリスナーの代わりにキーリストを使用することです。

myGuiTextField.addKeyListener(new KeyAdapter() { 
    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_ENTER) { 
      newUIcreated((UIPromptComboBox) evt.getSource()); 
     } 
    } 

    private void newUIcreated(UIPromptComboBox alteredGuiTextField) { 
      try { 
       UIPrompt uip = alteredGuiTextField.getUIPrompt(((PowerPointTextItem) myPPTRef).getValue()); 
      if (!simInfo.isInPrompts(uip)) { 
       simInfo.addUIPrompt(uip); 
       alteredGuiTextField.addNewUIPrompt(uip); 
      } 
     } catch (MissingPowerpointItem ex) { 
      Exceptions.printStackTrace(ex); 
     } 
    } 
}); 

ユーザーがEnterキーを押すとなし、他の時に一度、これは今だけ、あなたのイベントnewUIcreatedを発射する必要があります。あなたのアクションリスナーをこれで置き換えてください

+0

ありがとう、本当に良いアイデアです。しかし、私はそれを実装しようとしたが、キーイベントは発砲していない。どのキーが押されているかにかかわらず。何か案は? – emmistar

+0

'コンボボックス 'をコンポーネント名に変更しましたか?ちょうど私のコードで更新されました – XtremeBaumer

+0

私は、それはコンパイルエラーではない、それは活性化されていないリスナーの問題です – emmistar

関連する問題