将MouseListener与JComponent关联

时间:2015-04-13 16:44:25

标签: java swing

我的问题是,当本地课程MouseClickListener在我们执行moveTo之前调用comp对象的comp.addMouseListener(listener);方法时,那为什么后者呢? ?

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Scratch {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Moving Rectangle");
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final MyComponent comp = new MyComponent(); 
        class MouseClickListener implements MouseListener {
            public void mousePressed(MouseEvent event) {}
            public void mouseReleased(MouseEvent event) {}
            public void mouseClicked(MouseEvent event) {
                int x = event.getX();
                int y = event.getY();
                comp.moveTo(x, y);
            }
            public void mouseEntered(MouseEvent event) {}
            public void mouseExited(MouseEvent event) {}
        }
        MouseListener listener = new MouseClickListener();
        comp.addMouseListener(listener);
        frame.add(comp);
        frame.setVisible(true);
    }
}

class MyComponent extends JComponent {

    private Rectangle box;
    public MyComponent() {
        box = new Rectangle(0,0,50,50);
    }
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g; 
        g2.draw(box);
    }
    public void moveTo(int x, int y) {
        box.setLocation(x,y);
        repaint();
    }
}

1 个答案:

答案 0 :(得分:2)

通过致电comp.addMouseListener(listener);,您可以指定使用您定义的comp实施来监听您的组件listener


根据您的编辑,您想知道为什么按顺序调用它。

实际上,它是在实例化listener之后的第一个语句,因此以前无法完成。如果您尝试侦听非实例化的侦听器,则会失败。

MouseListener listener = new MouseClickListener();
comp.addMouseListener(listener);

请注意,如果您不打算重新使用听众,则只需执行

即可
comp.addMouseListener(new MouseClickListener());

您不能依赖于声明内部类的位置,可以在该部分之前添加侦听器。但是,您无法将其分配给您的组件,只需声明该类不会直接收听您的每个对象。需要分配。