2 wanbolin Wanbolin 于 2018.05.16 23:12 提问

关于Java鼠标监听器的问题

我按网上的鼠标监听器的内部类的方法写的结构,但是不知道为什么用鼠标之后没有结果,麻烦各位大神帮我看看

新人第一次用这个提问,关于提问的方式或者表述不清楚也欢迎大家指正啊

谢谢大家!!!

buttonListener是Map1的内部类

import javax.swing.*;
public class test
{
    public static void main(String[] args){  
        JFrame frame=new Map1(); 
        frame.setVisible(true);
        new Map1();
    }  
}


import javax.swing.JFrame;
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.*;
import java.awt.event.*;

public class Map1 extends JFrame 
{
    ImageIcon bank1 = new ImageIcon("bank1.jpg");//为按钮加载图片
    ImageIcon bank2 = new ImageIcon("bank2.jpg");
    ImageIcon plank1 = new ImageIcon("plank1.jpg");
    ImageIcon plank1_man = new ImageIcon("plank1_man.jpg");
    ImageIcon plank2 = new ImageIcon("plank2.jpg");
    ImageIcon plank2_man = new ImageIcon("plank2_man.jpg");
    ImageIcon stump1 = new ImageIcon("stump1.jpg");
    ImageIcon stump1_man = new ImageIcon("stump1_man.jpg");
    ImageIcon stump2 = new ImageIcon("stump2.jpg");
    ImageIcon stump2_man = new ImageIcon("stump2_man.jpg");
    ImageIcon stump3 = new ImageIcon("stump3.jpg");
    ImageIcon stump3_man = new ImageIcon("stump3_man.jpg");
    ImageIcon water1 = new ImageIcon("water1.jpg");
    ImageIcon water2 = new ImageIcon("water2.jpg");
    ImageIcon water3 = new ImageIcon("water3.jpg");
    ImageIcon water4 = new ImageIcon("water4.jpg");
   JButton[][] button=new JButton[13][9];//创建按钮对象
    public int xmove;
    public int ymove;
    public int xdecide=4;
    public int ydecide=12;
    public int decide[][]={
                   {0,0,0,0,0,0,0,0,0},//小人是1
                   {0,0,0,0,0,0,0,0,0},//木桩子是q2   
                   {2,0,0,0,0,0,0,0,0},//桥是3
                   {0,0,0,0,0,0,0,0,0},
                   {0,0,0,0,2,0,0,0,0},
                   {0,0,0,0,0,0,0,0,0},
                   {2,0,2,3,3,3,2,0,0},
                   {0,0,0,0,0,0,0,0,0},
                   {2,0,0,0,2,0,0,0,0},
                   {3,0,0,0,3,0,0,0,0},
                   {2,0,0,0,3,0,0,0,0},
                   {0,0,0,0,3,0,0,0,0},
                   {0,0,0,0,1,0,0,0,0},
                                     };
   public Map1()
   {
        setSize(300,450);//设置大小
        //JButton[][] button=new JButton[13][9];//创建按钮对象
        JPanel panel=new JPanel();
        setTitle("RiverCrossing");
        this.add(panel);
        panel.setLayout(new GridLayout(13,9,0,0));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        for(int a=0;a<9;a++)
        {
            button[0][a]=new JButton(bank2);        
        }
        for(int a=0;a<9;a++)
        {
            button[12][a]=new JButton(bank1);
        }
        for(int a=1;a<12;a++)
        {
            for(int b=0;b<9;b++)
            {
                button[a][b]=new JButton(water1);
            }
        }
        //下面是第一个地图的(这些跟问题没关)
        button[2][0]=new JButton(stump1);
        button[6][0]=new JButton(stump1);
        button[8][0]=new JButton(stump1);
        button[10][0]=new JButton(stump1);
        button[3][1]=new JButton(water4);
        button[5][1]=new JButton(water3);
        button[5][2]=new JButton(water4);
        button[6][2]=new JButton(stump1);
        button[8][2]=new JButton(water4);
        button[2][4]=new JButton(water4);
        button[4][4]=new JButton(stump1);
        button[8][4]=new JButton(stump1);
        button[3][6]=new JButton(water3);
        button[6][6]=new JButton(stump1);
        button[12][4]=new JButton(stump2_man);
        button[0][4]=new JButton(stump3);
        button[9][0]=new JButton(plank2);
        button[9][4]=new JButton(plank2);
        button[10][4]=new JButton(plank2);
        button[11][4]=new JButton(plank2);
        buttonListener btListener[][]=new buttonListener[13][9];//创建监听器
        for(int a=0;a<13;a++)
        {
           for(int b=0;b<9;b++)
           {
             panel.add(button[a][b]);
             button[a][b].addMouseListener(btListener[a][b]);//给监听器加到按钮
             //System.out.printf("21");
           }
        }

   }
     public class buttonListener implements MouseListener
     {
          public void mouseReleased(MouseEvent e)
      {   System.out.printf("1");
          outterloop:if(e.getButton() == MouseEvent.BUTTON1)//左键该执行的操作(移动小人)
           { 
              for(ymove=0;ymove<13;ymove++)//行的位置
              {
                  for(xmove=0;xmove<9;xmove++)//列的位置
                  {
                      if(e.getSource()==button[ymove][xmove])//点击的那个按钮的坐标
                      {   
                         //move(button,ymove,xmove);
                         ymove=0;
                         xmove=0;
                         break outterloop;
                      }
                  }
              }
           }

      }  
      public void mousePressed(MouseEvent e)
      {
      }
      public void mouseClicked(MouseEvent e)
      { 

      }
      public void mouseEntered(MouseEvent e)
      {

      }
      public void mouseExited(MouseEvent e)
      {

      }
   }
}

6个回答

Longtheworld
Longtheworld   2018.05.17 10:31
已采纳

本例中没有效果应该两处的问题:
1、只是为监听类创建了数组,并没有为每个数组元素new实例 ;
buttonListener btListener[][]=new buttonListener[13][9]
for(int a=0;a<13;a++){
for(int b=0;b<9;b++){
btListener[a][b]=new buttonListener();
}
}
2、button类比较时应用equals()方法,而不是==。
所以这个语句(if(e.getSource()==button[ymove][xmove]))是一直返回false的;
其实,完全没必要建立多监听实例,所有按钮可以共用同一个监听,在监听中判断它是哪个按钮触发的就可以了。
一个类最好只有一个Class,Map1类继承JFrame后可以继续implements MouseListener接口,
然后所有按钮 button[a][b].addMouseListener(this);然后在监听中判断属于哪个按钮,在进行相应的处理。

Wanbolin
Wanbolin 谢谢了,的确是没有为监听器new实例,但是e.getSource==button[ymove][xmove]是可以运行的,我试了您提供的equals(),也是可以运行的,然后也把代码改成一个类了,谢谢啦
3 个月之前 回复
init_vec
init_vec   2018.05.17 02:00

鼠标点击的是按钮,所以内部类不应该实现MouseListener,而是ActionListener,应该给按钮添加按钮监听器(ActionLister),而不是鼠标监听器(MouseListener)
求给分^^

Wanbolin
Wanbolin 谢谢您,已经解决了,是创建监听器的时候没有初始化。我试了您建议的ActionListener,是好使的,但是Mouse Listener也是好使的,最后谢谢啦
3 个月之前 回复
Thedreamisbig
Thedreamisbig   2018.05.17 09:05

public class Map1 extends JFrame 改为public class Map1 extends JFrame implements ActionListener(){}看看,没有足够时间看,如果还不行的话就有可能你是没有添加监听或是监听的出错,添加监听可以类似为这样a.addActionListener(this);

Wanbolin
Wanbolin 谢谢您,已经解决了,是因为创建监听器的时候没有初始化
3 个月之前 回复
qiangzh187
qiangzh187   2018.05.17 09:22

btListener只是建了个数组,数组的对象初始化,这样改一下应该就好了:


for(int a=0;a<13;a++)


    {
       for(int b=0;b<9;b++)

       {

        btListener[a][b]=new buttonListener();//这是增加的代码**

         panel.add(button[a][b]);

         button[a][b].addMouseListener(btListener[a][b]);//给监听器加到按钮

         //System.out.printf("21");

       }

    }

Wanbolin
Wanbolin 谢谢您,已经解决了,确实是因为创建监听器的时候没有初始化,谢谢啦
3 个月之前 回复
qq_41649217
qq_41649217   2018.05.17 09:49

鼠标点击的是按钮,所以内部类不应该实现MouseListener,而是ActionListener,应该给按钮添加按钮监听器(ActionLister),而不是鼠标监听器(MouseListener)

Wanbolin
Wanbolin 谢谢了,已经解决了,是因为创建监听器没有初始化,我试了ActionListener的确可以运行,但是MouseListener也是可以运行的,谢谢啦
3 个月之前 回复
weixin_42179681
weixin_42179681   2018.05.17 15:27

鼠标点击的是按钮,所以内部类不应该实现MouseListener,而是ActionListener,应该给按钮添加按钮监听器,而不是鼠标监听器

Wanbolin
Wanbolin 谢谢您,已经解决了,是创建监听器的时候没有初始化。我试了您建议的ActionListener,是好使的,但是Mouse Listener也是好使的,最后谢谢啦
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java鼠标监听器
1.按钮监听事件  JPanel jp =(JPanel) getContentPane();   jp.setLayout(new FlowLayout());   JButton jb = new JButton("点我");   jp.add(jb);   jb.addActionListener(new ActionListener() { @Override p
JAVA 关于按钮左键右键的监听器的使用 同时 可取消监听器
java代码介绍按钮监听器的使用,使用简单的例子,详细生动的展示了监听器的使用。
Java GUI事件监听器
Java中,事件处理的基本思路: 1.一个yuan
为按钮添加鼠标的事件监听器
实现功能为: 使用鼠标的不同按键点击按钮触发不同的事件。 使用到的知识点: 匿名内部类、创建窗体、为窗体添加按钮、添加事件监听器、使用默认布局管理器。 注意: 监听器的种类多样,要根据具体需要使用,可以查询API import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test
java鼠标监听器画图+点击X关闭窗口
package awt; import java.awt.*; import java.util.*; import java.awt.event.*; public class MouseFrame extends Frame{ ArrayList Poi = new ArrayList();//将所有的圆点装起来 MouseFrame (String str){ super(str);
java实现鼠标拖拽动作监听
源代码 import java.awt.event.ActionEvent ; import java.awt.event.ActionListener ; import java.awt.event.WindowListener ; import java.awt.event.MouseMotionAdapter ; import java.awt.event.MouseMotionListe
基于JPanel以及鼠标监听的Java 画图程序
基于Java 的画图程序,解压后直接打开工程,可以画出直线,园,线,点。需要其它图形可以自己设计,需要继承shape类;IDE环境为JCreator 4.5和JDK 1.5;
Java学习自我总结——监听鼠标双击事件
今天在学习的过程中突然发现,在鼠标操作的监听器中,没有提供鼠标双击的监听器,而双击是很常用的一种操作。话不多说,直接看实现监听鼠标单击/双击的事件的监听器。
java鼠标事件监听
addMouseListenerpublic void addMouseListener(MouseListener l)添加指定的鼠标侦听器,以接收发自此组件的鼠标事件。如果侦听器 l 为 null,则不会抛出异常并且不执行动作。 接口 MouseListener 用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口。(要跟踪鼠标移动和鼠标拖动,请使用 MouseMot
jtable的鼠标事件监听
今天折腾了这个事件监听了很久,重新定义jtable 继承mouselistener还是监听不到效果,最后发现这段代码很管用,直接在生成的jtable上添加mouseListenner类: //给table加上一个鼠标事件监听器对象         table.addMouseListener(new java.awt.event.MouseAdapter(){