Java mouseClicked显示JFrame在5到10次之间而不是1

时间:2014-04-03 15:32:01

标签: java jframe mouselistener

我试图为学校编写游戏代码,我必须使用MouseListener。我正在使用MouseListener作为主菜单。我想要选择" Spelregels" (转换为规则)来创建和显示包含游戏规则的新JFrame。

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

import javax.swing.JFrame;

public class MouseInput implements MouseListener {

    Main mainMenu = new Main();

    @Override
    public void mouseClicked(MouseEvent e) {
        int mx = e.getX();
        int my = e.getY();

//      public Rectangle startNieuwSpelButton = new Rectangle(100, 275, 250, 50);
//      public Rectangle hervatSpelButton = new Rectangle(100, 340, 250, 50);
//      public Rectangle spelregelsButton = new Rectangle(100, 405, 250, 50);
//      public Rectangle highscoresButton = new Rectangle(100, 470, 250, 50);

        // Start Nieuw Spel Button
        if(mx >= 100 && mx <= 350) {
            if (my >= 275 && my <= 325) {
                System.out.println("Je hebt op de startNieuwSpelButton geklikt.");
            }
        }

        // Hervat Spel Button
        if(mx >= 100 && mx <= 350) {
            if (my >= 340 && my <= 390) {
                System.out.println("Je hebt op de hervatSpelButton geklikt.");
            }
        }

        // Spelregels Button
        if(mx >= 100 && mx <= 350) {
            if (my >= 405 && my <= 455) {
                JFrame spelregelFrame = new JFrame("Lunar Lockout Spelregels");
                spelregelFrame.setSize(450, 650);
                spelregelFrame.setLocation(800, 100);
                spelregelFrame.setVisible(true);

            }
        }

        // Highscore Button
        if(mx >= 100 && mx <= 350) {
            if (my >= 470 && my <= 520) {
                System.out.println("Je hebt op de highscoreButton geklikt.");
            }
        }

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

}

我正在使用的代码。我想知道为什么它多次显示JFrame。像这样:http://puu.sh/7UuJb.jpg

提前致谢。

最诚挚的问候。

1 个答案:

答案 0 :(得分:0)

不是在paintComponent中添加鼠标侦听器,而是在需要重新绘制组件时调用它,您应该在构造函数中添加它。这样你的面板只会有一个鼠标监听器。

目前,每次重新粉饰时都会添加一个新的,所以他们会不断积累。

所以,基本上:

public class HoofdMenu extends JPanel {
  // ... member vars

  public HoofdMenu() {
    this.addMouseListener(new MouseInput());
  }

  @Override
  public void paintComponent(Graphics g) {
    // ... don't add listener in here
  }