if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON3){    //添加右击快捷菜单
}
   我这样是实现鼠标右击事件,就会弹出快捷菜单。但是当我直接右击不会显示出来快捷菜单的效果,
一定要我先左键单击一下,在点击右建才会弹出来。这是怎么回事呢? 该怎么写,望各位指点一下

解决方案 »

  1.   

    是不是监听的组件要左击才获取了焦点?对JFrame, JPanel什么的监听?
      

  2.   

    那应该也不是吧,右击应该也会有的吧,右击也是单击了吧。
       remoteShapeButton.addMouseListener(new MouseAdapter() {            public void mouseClicked(MouseEvent e) {
                   
                            if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON3) {                      }
      鼠标事件
      

  3.   

    楼主你没搞明白,主要问题在于你这个Listener添加在什么地方,假设你添加在一个Button上,当然需要当前button获得焦点,右击才有效,所以,你左键点一次,相当于获得焦点,右键弹出菜单;
    把MouseListener放到frame里就可以了
      

  4.   

    我是外部传进来的一个JButton。我对这个Button的事件,点击这个Button 就产生快捷菜单。public void catchClickedButton(final RemoteShapeButton remoteShapeButton) {        remoteShapeButton.addMouseListener(new MouseAdapter() {            public void mouseClicked(MouseEvent e) {
                  if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON3){
                   }
               }
      }
    remoteShapeButton就是我单击的那个Button ,我remoteShapeButton.addMouseListener(new MouseAdapter(){}); 这样不是加了事件吗?
     不行吗? 
      

  5.   

    e.getClickCount() == 1 改下 e.getClickCount() >= 1就ok了
      

  6.   

    e.getClickCount == 2 的时候不是双击了吗?
      

  7.   

    如果不嫌麻烦 可以考虑通过鼠标的坐标来获取对JBUTTON的焦点 我是新手 我以前在对树节点做右键操作的时候也碰到过 我就是这样解决的 我这是笨办法 不知道大大们有没有很好的办法 期待
      

  8.   

    那你可以监听鼠标的移动动作 当鼠标获取到JBUTTON的焦点时 就设定JBUTTON为选中状态不行么?
      

  9.   

    当我点击的时候就是对JButton获得了焦点。
     它是选中的状态了,但是必须先左击,右击才有菜单显示!右击的时候比左击拦截了一下。
      

  10.   

                MFrame mf = MFrame.getMainFrame();
                catchKeyClick[] cas = mf.getKeyOnClickCatchables();
                for (catchKeyClick elem : cas) {
                    elem.catchClickedButton(getClickeKey(select));         
                }
    //=====================================  public void catchClickedButton(final RemoteShapeButton remoteShapeButton) {    //这个是我自定义的一个事件,RemoteShapeButton自定义按钮        remoteShapeButton.addMouseListener(new MouseAdapter() {            public void mouseClicked(MouseEvent e) {           //鼠标事件
                    if (macroDevice.getMacroDeviceShowType() == FinalVariable.HOTKEY_TYPE) {
                        if (key.getKeyNo() >= 0 && key.getKeyNo() < 48) {
                            key.setHard(true);
                            if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
                                if (key.getCode() == null) {
                                    javax.swing.JDialog jd = new JDialog(MFrame.getMainFrame(), true);
                                    AddMacroButton addHardKeyMacro = new AddMacroButton(macroDevice, key, key.getKeyNo());
                                    jd.add(addHardKeyMacro);
                                    jd.setTitle("Add  Button");
                                    addHardKeyMacro.setJDialog(jd);
                                    jd.setBounds(300, 300, 400, 200);
                                    jd.setVisible(true);
                                } else {
                                    javax.swing.JDialog jd = new JDialog(MFrame.getMainFrame(), true);
                                    AddMacroButton addHardKeyMacro = new AddMacroButton(macroDevice, key, key.getKeyNo());
                                    jd.add(addHardKeyMacro);
                                    jd.setTitle("Modify  Button");
                                    addHardKeyMacro.setJDialog(jd);
                                    jd.setBounds(300, 300, 400, 200);
                                    jd.setVisible(true);
                                }                        }
                            if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON3) {//                            rightClickOne(e);                            javax.swing.JPopupMenu popupMenu = new JPopupMenu();
                         }
                    }
               }
          }
      

  11.   

    鼠标事件这边应该没什么问题 我在想你是不是传进来的JBUTTON必须要鼠标左键选中之后才能往里面传 你往上查查你JBUTTON选中的鼠标事件是什么 会不会问题出在那里了
      

  12.   

    e.getButton() == MouseEvent.BUTTON1 这句应该是 e.getButton() == MouseEvent.BUTTON3 吧? 
      

  13.   

    if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON3){     //添加右击快捷菜单 

    这块代码没问题的,我测试了下,问题应该是在别的地方,DEBUG看看嘛
    测试的代码,右键直接有响应的       JButton button = new JButton();
            button.addMouseListener(new MouseAdapter(){
    @Override
    public void mouseClicked(MouseEvent e) {
    if(e.getClickCount() ==1 && e.getButton() == MouseEvent.BUTTON3){
    System.out.println("a haha");
    }
    }
            });
            setLayout(new BorderLayout());  
            add(button,BorderLayout.EAST);
            
            setVisible(true); 
      

  14.   

    楼上是针对单个JBUTTON来做监听 不存在获取该JBUUTON的焦点和选中问题 LZ是对一个JFRAM里的所有按钮集体设置鼠标事件 这就可能牵涉到一个获取哪个JBUTTON的焦点或者说是选中哪个JBUUTON的问题了 所以LZ一直需要先左键选中一个JBUTTON才能出现右键事件 我觉得还是关于JBUUTON选中这方面有问题
      

  15.   

    是单击啊,是右击点一次就出现,就像 virginkj 所说的。所以不能让它先左击才能右击。
      

  16.   

    LZ 你可以考虑写一个类来继承JBUTTON 然后在这个类里面添加右键单击效果 这样的话 每次右键应该都只针对一个按钮 然后你把所有需要右键菜单的按钮都做成这个类的对象 你感觉可行么?
      

  17.   

    RemoteShapeButton 这个就是我那个自定义Button的类,继承了JButton。
    public void catchClickedButton(final RemoteShapeButton remoteShapeButton)。这个是自定义的事件,他在这个整个JPanel上面的,点击哪个Button我就传入的哪个RemoteShapeButton 。  问题就在这了,我调试了一下,因为这个事件是单击的,RemoteShapeButton 的鼠标事件又在catchClickedButton()这个事件里面写的。所有直接右击就根本没有触发右击事件。所以才出现要先点击一下,触发自定义的这个事件,才能进入右键的事件。。
      

  18.   

    跟我之前估计的一样 因为我发现你右键的鼠标事件是没有问题的 所以我就觉得问题肯定出在你传入JBUTTON的过程上 那你可以试着换一种思路 不要靠传入JBUTTON来添加鼠标右击事件 因为就算你把选中事件中做成右键选中 那你还是得点击右键两次才能出现事件 所以你可以考虑直接把鼠标右击事件添加在你自定义的那个JBUTTON类里面 当然 这个的前提是你的所有JBUUTON的右键事件都是统一的 我最近在忙CMMI 没空帮你实现 你自己试试 看可不可行
      

  19.   

    恩,是的。在这样写之前考虑过,就直接在自定义的JButton里面鼠标事件,但是不知道是哪里自己没理清楚逻辑,
    就怎么都不触发那个MouseClick事件,然后我就用actionFormed事件来代替用到自定义的事件传入Button了。(就是我现在的思路)
      这样写 就对双击事件也产生了影响,不止右击了  我根据双击弹出的对话框,会弹出来多次,关掉自己动弹出来。 我再好好去看看在自定义的JButton那边能好弄不?  非常谢谢virginkj 的 帮忙