【问题标题】:mouse listener not working鼠标监听器不工作
【发布时间】:2014-05-08 20:04:11
【问题描述】:

我的代码:

package a2048;

import javax.swing.JFrame;

public class GameWindow extends JFrame {

    public GameWindow() {

        add(new Main());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(409, 435);
        setLocationRelativeTo(null);
        setTitle("2048");
        setResizable(true);
        setVisible(true);

    }

    public static void main(String[] args) {
        new GameWindow();
    }
}

这是一类,另一类:

    package a2048;

import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class Main extends JPanel implements MouseListener
{
    int randx, randy, quit;
    int a1, a2, a3, a4, b1, b2, b3 ,b4, c1, c2, c3, c4, d1, d2, d3, d4;

    int GetRandom(int min, int max)
    {
       int range = (max - min) + 1;  
       double rand = (Math.random() * range) + min;
       return (int) rand;

    }

    public Main() 
    {
        setBackground(Color.BLACK);
        setDoubleBuffered(true);
    }

    public void paint(Graphics g) 
    {
        quit = 0;

        a1 = a2 = a3 = a4 = b1 = b2 = b3 = b4 = c1 = c2 = c3 = c4 = d1 = d2 = d3 = d4 = 0;

        super.paint(g);

        Graphics2D g2d = (Graphics2D)g;

        g2d.setColor(Color.white);
        g2d.drawLine(0, 0, 500, 0);
        g2d.drawLine(0, 100, 500, 100);
        g2d.drawLine(0, 200, 500, 200);
        g2d.drawLine(0, 300, 500, 300);
        g2d.drawLine(0, 400, 500, 400);      

        g2d.drawLine(0, 0, 0, 500);
        g2d.drawLine(100, 0, 100, 500);
        g2d.drawLine(200, 0, 200, 500);
        g2d.drawLine(300, 0, 300, 500);
        g2d.drawLine(400, 0, 400, 500);

        Font myFont = new Font("TimesRoman", Font.PLAIN, 75);
        g2d.setFont(myFont);

        while(quit == 0)
        {
            randx = GetRandom(1, 4);
            randy = GetRandom(1, 4);

            if(randx == 1)
            {
                if(randy == 1 && a1 == 0)
                {
                    a1 = 2;
                }
                else if(randy == 2 && a2 == 0)
                {
                    a2 = 2;
                }
                else if(randy == 3 && a3 == 0)
                {
                    a3 = 2;
                }
                else if(randy == 4 && a4 == 0)
                {
                    a4 = 2;
                }
            }

            else if(randx == 2)
            {
                if(randy == 1 && b1 == 0)
                {
                    b1 = 2;
                }
                else if(randy == 2 && b2 == 0)
                {
                    b2 = 2;
                }
                else if(randy == 3 && b3 == 0)
                {
                    b3 = 2;
                }
                else if(randy == 4 && b4 == 0)
                {
                    b4 = 2;
                }
            }

            else if(randx == 3)
            {
                if(randy == 1 && c1 == 0)
                {
                    c1 = 2;
                }
                else if(randy == 2 && c2 == 0)
                {
                    c2 = 2;
                }
                else if(randy == 3 && c3 == 0)
                {
                    c3 = 2;
                }
                else if(randy == 4 && c4 == 0)
                {
                    c4 = 2;
                }
            }

            else if(randx == 4)
            {
                if(randy == 1 && d1 == 0 && a1 == 0)
                {
                    d1 = 2;
                }
                else if(randy == 2 && d2 == 0 && a1 == 0)
                {
                    d2 = 2;
                }
                else if(randy == 3 && d3 == 0 && a1 == 0)
                {
                    d3 = 2;
                }
                else if(randy == 4 && d4 == 0 && a1 == 0)
                {
                    d4 = 2;
                }
            }

            if(a1 > 0)
                g2d.drawString(String.valueOf(a1), (randx * 100) - 70, (randy * 100) - 25);
            if(a2 > 0)
                g2d.drawString(String.valueOf(a2), (randx * 100) - 70, (randy * 100) - 25);
            if(a3 > 0)
                g2d.drawString(String.valueOf(a3), (randx * 100) - 70, (randy * 100) - 25);
            if(a4 > 0)
                g2d.drawString(String.valueOf(a4), (randx * 100) - 70, (randy * 100) - 25);
            if(b1> 0)
                g2d.drawString(String.valueOf(b1), (randx * 100) - 70, (randy * 100) - 25);
            if(b2 > 0)
                g2d.drawString(String.valueOf(b2), (randx * 100) - 70, (randy * 100) - 25);
            if(b3 > 0)
                g2d.drawString(String.valueOf(b3), (randx * 100) - 70, (randy * 100) - 25);
            if(b4 > 0)
                g2d.drawString(String.valueOf(b4), (randx * 100) - 70, (randy * 100) - 25);
            if(c1 > 0)
                g2d.drawString(String.valueOf(c1), (randx * 100) - 70, (randy * 100) - 25);
            if(c2 > 0)
                g2d.drawString(String.valueOf(c2), (randx * 100) - 70, (randy * 100) - 25);
            if(c3 > 0)
                g2d.drawString(String.valueOf(c3), (randx * 100) - 70, (randy * 100) - 25);
            if(c4 > 0)
                g2d.drawString(String.valueOf(c4), (randx * 100) - 70, (randy * 100) - 25);
            if(d1 > 0)
                g2d.drawString(String.valueOf(d1), (randx * 100) - 70, (randy * 100) - 25);
            if(d2 > 0)
                g2d.drawString(String.valueOf(d2), (randx * 100) - 70, (randy * 100) - 25);
            if(d3 > 0)
                g2d.drawString(String.valueOf(d3), (randx * 100) - 70, (randy * 100) - 25);
            if(d4 > 0)
                g2d.drawString(String.valueOf(d4), (randx * 100) - 70, (randy * 100) - 25);

            quit = 1;
        }

        Toolkit.getDefaultToolkit().sync();
        g.dispose();   
    }

    public void mouseExited(MouseEvent e) 
    {
        repaint(); 
    }

    public void mouseReleased(MouseEvent e) 
    {
        repaint(); 
    }

    public void mousePressed(MouseEvent e) 
    {
        repaint(); 
    }

    public void mouseEntered(MouseEvent e) 
    {
        repaint(); 
    }

    public void mouseClicked(MouseEvent e) 
    {
        a1 = 5;
        repaint();  
    }
}

我不明白为什么当我单击窗口时 mouseClicked 方法没有做任何事情。我想要它做的是将 a1 设置为 5,然后在屏幕上打印它,但它根本没有做任何事情。为了让 MouseListener 正常工作,我应该做些什么改变?

【问题讨论】:

  • 你想让你的MouseListener 听什么?您需要 addMouseListener() 注册它才能真正收听。
  • 我希望 MouseListener 能够检测到我何时单击。另外,我应该在哪里添加 addMouseListener() 到我的程序...你能给我举个例子吗?
  • 当您点击窗口上的任意位置时?
  • 是的。稍后我会希望它检测您点击的位置,但现在,我希望它在任何地方。
  • 你读过 MouseListener 教程吗?那里都有很好的解释,Google 会帮你找到。

标签: java swing jpanel paint mouselistener


【解决方案1】:

MouseListener 需要注册它正在侦听的内容 才能执行任何操作。

当您在某物上单击鼠标时,它会生成一个MouseEvent 并在任何正在监听它的东西上调用方法,将该事件作为参数传入。

您似乎将侦听器作为JPanel 的一部分实现,因此除了将其作为组件添加到GameWindow 中之外,您还需要将其注册为窗口上的鼠标侦听器。

替换

add(new Main());

Main main = new Main();
addMouseListener(main);
add(main);

编辑

HovercraftFullOfEels 建议的更简洁的方法是使用 Main JPanel 自己监听鼠标事件。为此,您将在 Main 的构造函数中调用 addMouseListener(),而不是在封闭的 JFrame 中:

public Main() {
    addMouseListener(this);
    setBackground(Color.BLACK);
    setDoubleBuffered(true);
}

【讨论】:

  • 将 MouseListener 添加到 Main JPanel 而不是 JFrame 通常不是更好吗?
  • @HovercraftFullOfEels 我不确定这些天什么被认为是 gui 设计的最佳实践。我已经在 OPs 程序中尝试了这两种方法,但它似乎没有任何功能差异。
  • @azurefrog:不,这不会有什么不同,但只要他关心按钮被按下的位置,它就会有所不同。例如,如果他想在按钮按下位置的主 JPanel 中绘制一个点。如果您将 MouseListener 添加到 JFrame,您将搞砸。我敢猜测 99.9% 的情况下,MouseListener 不应该被添加到顶级窗口。
  • 嗯,这很好,我会相应地更新我的答案。
猜你喜欢
  • 2018-03-09
  • 2015-11-30
  • 2013-07-20
  • 2014-12-13
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多