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
を正しく実装していない可能性があります。あなたの助けをありがとう
コンボボックスの選択を解除すると、イベントを起動するだけで大丈夫ですか?今私は正確に何が起こるべきか、起こっていることを理解していませんでした – XtremeBaumer
@XtremeBaumer、私の質問を読んでくれてありがとう。 私は、コンボボックスを編集した後、ユーザーがEnterキーを押したときに、選択を解除するのではなく、起動することをお勧めします。現在のところ、問題は、入力が押されたときと、別のコンボボックスが選択されたときに発火して、コードがかなりの回数繰り返されることです。 – emmistar