在自定义ComboBox编辑器上实现actionListener()方法

时间:2013-12-18 08:42:46

标签: java swing action actionlistener jtextarea

大家好,下面是我的自定义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方法添加到没有它的组件?

或者我在哪里可以找到有关如何在我的案例中使用EventListenerAWTEventMutlicaster的说明?

似乎我无法解释我需要什么,我知道如何将ActionListener添加到组件,我不知道如何实现方法addActionListener它自己。 (例如,如果JComboBox没有方法addActionListener,则需要向其添加ActionListener)。

3 个答案:

答案 0 :(得分:0)

下面是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);
    }
}
祝你好运

答案 1 :(得分:0)

JComboBox date1 = new JComboBox (date);
date1.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Change");
    }
});

答案 2 :(得分:0)

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

在任何情况下,据我所知,将动作监听器设置到编辑器的原因是允许在完成编辑(通过按Enter键)时通知JComboBox这是可能的如果编辑器是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);
    }
    ...
}