如何外化MouseListener?

时间:2016-01-27 14:53:48

标签: java swing listener

注意:我知道MouseAdapter - 类的存在,但由于我可能会在以后覆盖所有方法,它的优势会丢失吗?)

我有一个MainProgram.java类,我在其中添加了几个组件。他们中的大多数都有一个Listener(ActionListener,MouseListener,...),它在我的主类中有点拥挤。

因此,我正在尝试"外化"那些听众进入自己的班级。到目前为止,我已经在我的主类中使用了内部类,这使得访问变量,组件......非常简单明了。

但是对于外部监听器,我不确定实现它们的最佳方法是什么。

例如,当我想知道哪些标签被点击时,我正在获取事件,获取事件的来源,将其转换为JLabel然后获取文本用来比较字符串的标签!

这样可行,但似乎很容易出错(如果我更改了我的主类中的JLabel文本? - >监听器中断)并且非常不洁净。

我试图通过谷歌和StackOverflow搜索更好的方法,但只找到内部类方法。

那么有更好的方法可以访问我的组件/外部化我的听众吗?

public class MainProgram extends JFrame {
    public MainProgram() {
        super("Landing Page");
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel westPanel = new JPanel();

        JLabel lbl_orderStatus = new JLabel("Order Status");
        JLabel lbl_technicalDocu = new JLabel("Technical Documentation");
        JLabel lbl_checkReport = new JLabel("Check Report");

        MouseListenerBoldFont mouseListenerLabelBoldPlain = new MouseListenerBoldFont();

        lbl_orderStatus.addMouseListener(mouseListenerLabelBoldPlain);
        lbl_technicalDocu.addMouseListener(mouseListenerLabelBoldPlain);
        lbl_checkReport.addMouseListener(mouseListenerLabelBoldPlain);

        westPanel.add(lbl_orderStatus);
        westPanel.add(lbl_technicalDocu);
        westPanel.add(lbl_checkReport);
        add(westPanel);
    }

    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                MainProgram window = new MainProgram();
                window.setVisible(true);
            } 
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

MouseListenerBoldFont.java

public class MouseListenerBoldFont implements MouseListener{

    Object lbl_westPanel;

    @Override
    public void mouseClicked(MouseEvent e) {
        if(((JLabel)e.getSource()).getText().equals("Order Status")){
            System.out.println("Order Status clicked");
        };
        if(((JLabel)e.getSource()).getText().equals("Technical Documentation")){
            System.out.println("Technical Documentation clicked");
        };
        if(((JLabel)e.getSource()).getText().equals("Check Report")){
            System.out.println("Check Report clicked");
        };
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        lbl_westPanel = e.getSource();
        ((JComponent) lbl_westPanel).setFont(new Font("tahoma", Font.BOLD, 12));
    }

    @Override
    public void mouseExited(MouseEvent e) {
        lbl_westPanel = e.getSource();
        ((JComponent) lbl_westPanel).setFont(new Font("tahoma", Font.PLAIN, 11));
    }

    @Override
    public void mousePressed(MouseEvent e) {    
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }
}

3 个答案:

答案 0 :(得分:2)

确定这不是最佳方式,但可能对您的问题有用

List<User>

然后

public class MyLabel extends JLabel implements MouseListener {
    public MyLabel() {
        addMouseListener(this);
    }
    public MyLabel(String txt) {
        super(txt);
        addMouseListener(this);
    }
    public void mouseClicked(MouseEvent e) {
        System.out.println(getText() + " clicked");
    }
    public void mouseEntered(MouseEvent e) {
        setFont(new Font("tahoma", Font.BOLD, 12));
    }
    public void mouseExited(MouseEvent e) {
        setFont(new Font("tahoma", Font.PLAIN, 11));
    }
    public void mousePressed(MouseEvent e) { }
    public void mouseReleased(MouseEvent e) { }
}

答案 1 :(得分:1)

我的建议是编写内联(匿名类)处理程序,将实际处理转发给另一个非匿名函数。这会给你类似的东西:

    JLabel lblOrderStatus = new JLabel("Order Status");
    lblOrderStatus.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) { 
            doWhateverClickOnOrderStatusRequires();
        }
    });

    // much later
    private void doWhateverClickOnOrderStatusRequires() { ... }

外部非完全处理程序方法(doWhateverClickOnOrderStatusRequires)的名称应捕获它尝试实现的任务(例如,launchRockets);使用此模式,您可以从多个处理程序中调用相同的非完全处理程序方法。由于编译器会在编译时检查调用是否有效,因此不会涉及脆弱的字符串常量。

答案 2 :(得分:0)

您可能仍然希望使用扩展MouseAdapter的类,因为它可以同时用作MouseListener,MouseMotionListener和MouseWheelListener(您只需将其作为所有这些添加到组件中)。我不确定为什么你需要在JLabel上获取文本以检测它是否是被点击的文本。您应该创建一个扩展MouseAdapter的类,并将其专门用于JLabel,然后将其添加到该JLabel。您应该定义一个自定义构造函数,如果您需要将JLabel作为参数,以便它自动知道JLabel与之交互的内容。然后,您可以添加一个将事件传递给主类的方法。