簡體   English   中英

失去焦點時可編輯的JComboBox觸發ActionListener

[英]Editable JComboBox firing ActionListener when losing focus

我正在編寫擴展JComboBox的類( UIPromptComboBox )。 組合框是可編輯的,對於類的一個應用程序,它是通過控制ActionListener來實現的。

當前,在編輯組合框時會觸發ActionListener ,這很好。 但是,當我取消選擇組合框時也會觸發此ActionListener ,並且我無法區分兩個事件,也不想在取消選擇組合框時觸發它。

實施班

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);
                }
            }
        });
    }

擴展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);
    }

}

由於失去焦點而導致的多次觸發導致創建多個對象並將其添加到列表中。 我想我可能沒有正確實現ActionListener 謝謝您的幫助

如您所說,您僅希望事件在用戶按下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);
        }
    }
});

現在,這應該只觸發用戶newUIcreated事件,一旦用戶按下Enter鍵,就別無其他選擇。 以此替換您的動作監聽器

我現在終於找到了問題。

UIPrompt的顯示包括添加了有時包含換行符的字符串。

單擊另一個字段的操作觸發了UIPrompt的呈現,但是當其中包含換行符時,它將再次觸發ActionListener 這就是為什么comboBoxEdited重復動作的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM