我的问题是,当本地课程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();
}
}
答案 0 :(得分:2)
通过致电comp.addMouseListener(listener);
,您可以指定使用您定义的comp
实施来监听您的组件listener
。
根据您的编辑,您想知道为什么按顺序调用它。
实际上,它是在实例化listener
之后的第一个语句,因此以前无法完成。如果您尝试侦听非实例化的侦听器,则会失败。
MouseListener listener = new MouseClickListener();
comp.addMouseListener(listener);
请注意,如果您不打算重新使用听众,则只需执行
即可comp.addMouseListener(new MouseClickListener());
您不能依赖于声明内部类的位置,可以在该部分之前添加侦听器。但是,您无法将其分配给您的组件,只需声明该类不会直接收听您的每个对象。需要分配。