Реализуйте метод 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);
    }
    ...
}
Другие вопросы по тегам