【问题标题】:How to add ActionListener to customize component如何添加 ActionListener 来自定义组件
【发布时间】:2013-01-20 18:00:32
【问题描述】:

我创建了一个组件,想添加ActionListener来自定义组件。
我想创建一个类似JButton 的组件,并在设计视图的Events 对话框中显示actionPerformed 事件。

JBaseComponent 类将派生自 JComponent

代码:

public class JCButton extends JBaseComponent implements ActionListener,ItemSelectable,ChangeListener{

private JButton _button=new JButton();
private ActionEvent _actevent=new ActionEvent(this,ActionEvent.ACTION_PERFORMED,"");

public JCButton() {
    super();
    _button.setPreferredSize(new Dimension(105, 25));
    _button.setFocusTraversalKeysEnabled(false);

     _button.addMouseListener(new MouseAdapter() {

        public void mousePressed(MouseEvent e) {
            JComponent c = (JComponent) e.getSource();
            TransferHandler handler = c.getTransferHandler();
            handler.exportAsDrag(c, e, TransferHandler.COPY);
        }
    });

    _button.setTransferHandler(new TransferHandler("btn"));

    setColorFocus(false);

    _button.addActionListener(this);
    actionPerformed(_actevent);
    addActionListener(this);
   revalidate();
   repaint();
    add(_button);
}

public void setText(String txt){
    _button.setText(txt);
}

public void setIcon(Icon ico){
    _button.setIcon(ico);
}

public void addActionListener(ActionListener act){
    _button.addActionListener(act);
}

@Override
public void actionPerformed(ActionEvent e) {
}

@Override
public Object[] getSelectedObjects() {
    return null;
}

@Override
public void addItemListener(ItemListener l) {

}

@Override
public void removeItemListener(ItemListener l) {

}

@Override
public void stateChanged(ChangeEvent e) {

}
}

【问题讨论】:

    标签: java swing events dialog actionlistener


    【解决方案1】:

    如果您真的不能为此使用JButton,那么您的下一个最佳选择是扩展AbstractButton,其中包括提到的EventListenerList 管道here。例如,

    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import javax.swing.AbstractAction;
    import javax.swing.AbstractButton;
    import javax.swing.Action;
    import javax.swing.DefaultButtonModel;
    import javax.swing.JFrame;
    import javax.swing.UIManager;
    import javax.swing.plaf.ButtonUI;
    
    /** @see https://stackoverflow.com/a/14429304/230513 */
    public class JCButtonTest {
    
        private void display() {
            JFrame f = new JFrame("JCButtonTest");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new JCButton(new AbstractAction("JCButton") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println(e);
                }
            }));
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        private static class JCButton extends AbstractButton {
    
            public static final int SIZE = 32;
    
            public JCButton(Action action) {
                this.setModel(new DefaultButtonModel());
                System.out.println(action.getValue(Action.NAME));
                this.init((String) action.getValue(Action.NAME), null);
                this.addActionListener(action);
            }
    
            @Override
            public void updateUI() {
                setUI((ButtonUI) UIManager.getUI(this));
            }
    
            @Override
            public String getUIClassID() {
                return "ButtonUI";
            }
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new JCButtonTest().display();
                }
            });
        }
    }
    

    【讨论】:

    • 不能使用 AbtractButton,因为派生自 JBasicComponent 并且不能派生两个类
    • 作为替代方案,请考虑 compositiondelegation
    【解决方案2】:

    这个thread 可以帮助您了解ActionListener 的目的以及如何使用它。

    【讨论】:

      【解决方案3】:

      实现ActionListener接口,你要做的就是将监听器委托给_button

      【讨论】:

        猜你喜欢
        • 2011-08-30
        • 2011-08-27
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 2012-12-09
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        相关资源
        最近更新 更多