大家好,下面是我的自定义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)。
答案 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);
}
...
}