繁体   English   中英

将MouseListener与JComponent关联

[英]Associating a MouseListener with a JComponent

我在这里的问题是,当本地类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();
    }
}

通过调用comp.addMouseListener(listener); 您指定使用定义的listener实现listener组件comp


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

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

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

请注意,如果您不打算重复使用监听器,则只需

comp.addMouseListener(new MouseClickListener());

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM