Реализуйте метод addActionListener() в пользовательском ComboBoxEditor
Добрый день всем, ниже код моего обычая JComboBox
редактор:
public class BoxEditor implements ComboBoxEditor{
private JTextArea editor ;
public BoxEditor() {
editor = new JTextArea();
editor.setSize(360,55);
editor.setWrapStyleWord(true);
editor.setLineWrap(true);
editor.setInheritsPopupMenu(true);
}
@Override
public void addActionListener(ActionListener l) {
System.out.println("addActionListener BoxEditor " + l.toString());
}
@Override
public void removeActionListener(ActionListener l ) {}
@Override
public Component getEditorComponent(){
return editor;
}
@Override
public void selectAll() {}
@Override
public Object getItem() {
System.out.println("getItem from BoxEditor : " + editor.getText());
return editor.getText();
}
@Override
public void setItem(Object item) {
if (item != null) {
System.out.println("setting item to BoxEditor item is :" + item.toString() );
editor.setText(item.toString());
}
}
}
Как вы можете видеть, я использую JTextArea
как компонент редактора, но проблема в том, что у меня нет addActionListener()
метод и, как результат, я не могу добавить JComboBox
слушатель моего ComboBoxEditor. И когда я использую мой редактор, никакие действия не отправляются в поле со списком.
Причина, почему я использую JTextArea
потому что мне нужны такие вещи, как WrapStyleWord, LineWrap и другие функции, которые не предоставляются JTextField
,
я вижу это addActionListener()
Реализация использует EventListenerList, поэтому я попытался сделать что-то подобное в примере, но кажется, что пример не может привести к полной рабочей проблеме.
Вопрос: как я могу добавить метод addActionListener к компоненту, у которого его нет?
Или где я могу найти объяснение о том, как с помощью EventListener
или же AWTEventMutlicaster
для моего случая?
Кажется, я не могу хорошо объяснить, что мне нужно, я знаю, как добавить ActionListener в компонент, я не знаю, как реализовать метод addActionListener сам по себе. (например, если у JComboBox нет метода addActionListener и вам необходимо добавить к нему ActionListener).
3 ответа
Пример кода ниже для jcombobox и выполненное действие
import java.awt.event.*;
import javax.swing.*;
public class Combo {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel=new JPanel();
String[] list = { "1", "2", "3"};
final JComboBox cb = new JComboBox(list);
panel.add(cb);
cb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(cb.getSelectedItem());
}
});
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
}
}
удачи
JComboBox date1 = new JComboBox (date);
date1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
System.out.println("Change");
}
});
Класс BasicComboboxEditor является редактором по умолчанию для редактируемых полей со списком и реализован в виде JTextField. Если вы посмотрите на его реализацию, вы увидите что-то вроде этого:
public class BasicComboBoxEditor implements ComboBoxEditor,FocusListener {
protected JTextField editor;
...
public void addActionListener(ActionListener l) {
editor.addActionListener(l);
}
public void removeActionListener(ActionListener l) {
editor.removeActionListener(l);
}
}
Это означает, что ActionListener просто перенаправлен в редактор. В вашем случае проблема в том, что JTextArea не имеет методов для добавления / удаления прослушивателей действий, поэтому вы не можете просто сделать editor.addActionListener(l)
, Но вы можете использовать EventListenerList следующим образом:
class BoxEditor implements ComboBoxEditor {
private final EventListenerList listenerList = new EventListenerList();
...
@Override
public void addActionListener(ActionListener l) {
listenerList.add(ActionListener.class, l);
}
@Override
public void removeActionListener(ActionListener l ) {
listenerList.remove(ActionListener.class, l);
}
}
В любом случае, насколько мне известно, причина установки прослушивателя действия для редактора заключается в том, чтобы JComboBox уведомлялся о завершении редактирования (нажав Enter
ключ), что возможно, если редактор JTextField
но это не имеет смысла, если редактор JTextArea
, Может быть, это причина, почему вы заявили это:
я вижу это
addActionListener
реализация используетEventListenerList
я пытаюсь сделать что-то, как в примере, но кажется, что пример не может привести к полной рабочей проблеме.
Имея это в виду, вам нужно будет предоставить способ уведомить поле со списком о завершении выпуска. Например что-то вроде этого:
class BoxEditor implements ComboBoxEditor {
private final JTextArea editor ;
private final EventListenerList listenerList = new EventListenerList();
public BoxEditor() {
editor = new JTextArea();
editor.setWrapStyleWord(true);
editor.setLineWrap(true);
editor.setInheritsPopupMenu(true);
// When CTRL + ENTER is pressed the stopEditing action is fired
editor.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.CTRL_DOWN_MASK), "stopEditing");
editor.getActionMap().put("stopEditing", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
ActionEvent evt = new ActionEvent(editor, ActionEvent.ACTION_PERFORMED, "stopEditing");
fireActionEvent(evt);
}
});
}
private void fireActionEvent(ActionEvent evt){
for(ActionListener al : listenerList.getListeners(ActionListener.class)){
al.actionPerformed(evt);
}
}
@Override
public void addActionListener(ActionListener l) {
listenerList.add(ActionListener.class, l);
}
@Override
public void removeActionListener(ActionListener l ) {
listenerList.remove(ActionListener.class, l);
}
...
}