代码之家  ›  专栏  ›  技术社区  ›  Bernard

我的(Java/Swing)MouseListener没有监听,请帮我找出原因

  •  6
  • Bernard  · 技术社区  · 16 年前

    所以我有一个 JPanel 实施 MouseListener MouseMotionListener :

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class DisplayArea extends JPanel implements MouseListener, MouseMotionListener  {
        public DisplayArea(Rectangle bounds, Display display) {
            setLayout(null);
            setBounds(bounds);
            setOpaque(false);
            setPreferredSize(new Dimension(bounds.width, bounds.height));
    
            this.display = display;
        }
    
        public void paintComponent(Graphics g) {
             Graphics2D g2 = (Graphics2D)g;
             if (display.getControlPanel().Antialiasing()) {
                 g2.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
             }
             g2.setColor(Color.white);
             g2.fillRect(0, 0, getWidth(), getHeight());
        }
    
        public void mousePressed(MouseEvent event) {
            System.out.println("mousePressed()");
            mx1 = event.getX();
            my1 = event.getY();
        }
    
        public void mouseReleased(MouseEvent event) {
            System.out.println("mouseReleased()");
            mx2 = event.getX();
            my2 = event.getY();
    
            int mode = display.getControlPanel().Mode();
            switch (mode) {
            case ControlPanel.LINE:
                 System.out.println("Line from " + mx1 + ", " + my1 + " to " + mx2 + ", " + my2 + ".");
            }
        }
    
        public void mouseEntered(MouseEvent event) {
            System.out.println("mouseEntered()");
        }
    
        public void mouseExited(MouseEvent event) {
            System.out.println("mouseExited()");
        }
    
        public void mouseClicked(MouseEvent event) {
            System.out.println("mouseClicked()");
        }
    
        public void mouseMoved(MouseEvent event) {
            System.out.println("mouseMoved()");
        }
    
        public void mouseDragged(MouseEvent event) {
             System.out.println("mouseDragged()");
        }
    
        private Display display = null;
    
        private int mx1 = -1;
        private int my1 = -1;
        private int mx2 = -1;
        private int my2 = -1;
    }
    

    问题是,这些鼠标功能都没有被调用过。 DisplayArea 创建方式如下:

    da = new DisplayArea(new Rectangle(CONTROL_WIDTH, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT), this);
    

    我不是一个真正的Java程序员(这是作业的一部分),但我看不到任何明显的东西。比我聪明的人能看到任何东西吗?

    3 回复  |  直到 10 年前
        1
  •  13
  •   Shabaz    16 年前

    这个 实现mouselistener、mousemotionlistener 只允许displayArea类监听一些待定义的Swing组件的鼠标事件。你必须明确地定义它应该监听什么。所以我想你可以在构造函数中添加这样的东西:

    this.addMouseListener(this);
    this.addMouseMotionListener(this);
    
        2
  •  3
  •   Neal    16 年前

    我在代码中没有看到任何地方你为DisplayArea调用addMouseListener(this)或addMouseMotionListener(this)来订阅这些事件。

        3
  •  3
  •   Paul Tomblin    16 年前

    我在这里没有看到任何注册到鼠标监听器的代码。您必须在DisplayArea上调用addMouseListener(this)和addMouseMotionListener(this)。