代码之家  ›  专栏  ›  技术社区  ›  BillMan mulya

用于jpanel的mouselistener缺少mouselicked事件

  •  9
  • BillMan mulya  · 技术社区  · 16 年前

    我有一个jpanel,我为它创建了一个鼠标测试器,我看到了一些我无法解释的行为。

    通常,当我在jpanel中单击鼠标时,会看到以下事件触发:

    mousePressed
    mouseReleased
    mouseClicked
    

    在某些情况下,我看不到鼠标被遮挡的事件火,我只看到:

    mousePressed
    mouseReleased
    

    当我点击这些时候,我不认为我做了任何不寻常的事情。有人能解释一下为什么我可能看不到被老鼠咬过的事件吗?

    我不确定它是否相关,但我确实在面板中使用javax.swing.timer运行了一个动画。

    感谢您的帮助。

    编辑: 添加复制问题的测试代码。我不确定,但我想知道我的鼠标是否与此有关。我有一只超级敏感的游戏老鼠(我以前的密码4天)。

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class Test {
    
        public static void main(String[] args) {
            final Test test = new Test();
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    test.createAndShowGUI();
                }
            });
        }
    
        protected void createAndShowGUI() {
            JFrame frame = new JFrame();
            frame.setPreferredSize(new Dimension(1024, 768));
            frame.setTitle("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JPanel panel = new JPanel();
            panel.setBackground(Color.WHITE);
    
            panel.addMouseListener(new MouseListener() {
                @Override
                public void mouseReleased(MouseEvent e) {
                    System.out.println(":MOUSE_RELEASED_EVENT:");
                }
                @Override
                public void mousePressed(MouseEvent e) {
                    System.out.println("----------------------------------\n:MOUSE_PRESSED_EVENT:");
                }
                @Override
                public void mouseExited(MouseEvent e) {
                    System.out.println(":MOUSE_EXITED_EVENT:");
                }
                @Override
                public void mouseEntered(MouseEvent e) {
                    System.out.println(":MOUSE_ENTER_EVENT:");
                }
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println(":MOUSE_CLICK_EVENT:");
                }
            });
    
            frame.add(panel);
            frame.pack();
            frame.setVisible(true);
        }
    
    }
    
    4 回复  |  直到 13 年前
        1
  •  16
  •   Andrew    15 年前

    每 http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html :

    “您将看到一个鼠标释放事件。如果您没有移动鼠标,将出现一个单击鼠标的事件。”

    我刚遇到这个问题。如果移动鼠标,则不会发生单击事件。我真的不知道有了这些知识,有什么好的鼠标被挡住了。我通过使用mouserelealed并检查鼠标是否在对象中修复了它:

    public void mouseReleased(MouseEvent e) {
        if(objectWithListener.contains(e.getPoint())){
            doClickAction();
        }
    }
    
        2
  •  3
  •   BillMan mulya    16 年前

    我想我在这里发现了问题。我在鼠标压力和鼠标释放之间得到了中间的鼠标不规则事件。mousemoved似乎没有引起问题,但mousedragged引起了问题。

    我现在不确定正确的解决方案,但至少现在我可以解释发生了什么。

    干杯

    -比尔

        3
  •  0
  •   Robbie62    13 年前

    给那些有这个问题的人一些建议。

    第一:可能是你的老鼠变老了。我有点奇怪的行为,结果发现是老鼠偶尔会扔坐标,然后它会跳回到原来的位置。这将提供鼠标拖动事件。尝试其他鼠标…

    第二:我遇到了一个问题,我需要一个jpanel(a),我正在绘制,在另一个jpanel(b)中设置为borderlayout.center layout,它本身就在一个jscrollpane中。

    当jpanel(b)调整大小时,由于borderlayout布局管理器,绘图面板(a)将缩放到正确的大小,但是(a)如果(a)现在大于其原始大小,则忽略其原始尺寸之外的任何单击。

    调整jpanel(b)的大小时,布局管理器在调整(a)以适应jpanel(b)的中心时没有将(a)的尺寸设置为新的尺寸。鼠标单击事件只会在jpanel(a)的原始维度内触发单击。我不得不手动将jpanel(a)的大小设置为它新的缩放尺寸,以便对jpanel(a)的所有区域进行鼠标单击。

        4
  •  0
  •   David    13 年前

    在这种情况下,当我只需要单击事件时,我使用一个简单的 ActionListener 而不是 MouseListner . 这个 actionPerformed 事件确实会像我们希望单击事件那样被激发,至少对于按钮和类似的按钮来说,也就是说,只要鼠标在释放时与按下时处于相同的控件,那么 动作表演 将激发事件。