【问题标题】:Java statement causes a mouseClick to be a mouseRelease for MouseListener in JpanelJava 语句使 mouseClick 成为 Jpanel 中 MouseListener 的 mouseRelease
【发布时间】:2015-04-27 21:19:52
【问题描述】:

我通过以下方式向我的 JPanel 添加了鼠标侦听器。输出到 JPanel 的是从一组图像绘制到屏幕上的图像。

public class NewFrame extend JFrame {
    public New JFrame() {

        statusBar = new JLabel("Mouse Outdide Panel"); //displays events for mouse
        add(statusBar,BorderLayout.SOUTH); //add to JFrame
        MouseHandler handler = new MouseHandler(); 
        JPanelMap.addMouseListener(handler); //add both mouse listeners to JPanel
        JPanelMap.addMouseMotionListener(handler);
}
private class MouseHandler implements MouseListener,
        MouseMotionListener
    {
        public void mouseClicked(MouseEvent event) {

            statusBar.setText( String.format( "Clicked at [%d, %d]",
                event.getX() , event.getY() ) );
            int x = event.getX();
            int y = event.getY();

            mapObject.updateDockOrShip(x, y,text); //updates selected icon on screen
        }

        public void mousePressed(MouseEvent event) {
        }

        public void mouseReleased(MouseEvent event) {
            statusBar.setText( String.format( "Released at [%d, %d]",
                event.getX() , event.getY() ) );
            int x = event.getX();
            int y = event.getY();

            /*this is the troubleMaker, if i delete this line all "clicks"
              work everywhere on my JPanel. but if i leave it in, 
              clicks work in some areas of JPanel, and other legitimate clicks
              are recognized as mouseReleased in different area of JPanel
            */

            mapbject.checkDocks(x,y,tempint); //TROUBLE

        }
        public void mouseEntered( MouseEvent event )
        {
        } 

        public void mouseExited( MouseEvent event )
        {
        } 
        public void mouseDragged( MouseEvent event )
        {

        } 
        public void mouseMoved( MouseEvent event )
        { 
        } 

    }
}

我已经在给定的代码中突出显示了令人不安的声明。一旦我实现了那条线,地图的某些部分就可以通过点击来点击,而其他部分则不可点击,即使我仍然执行相同的点击。我认为无论您在哪里单击鼠标侦听器,或者我假设错误或遗漏了什么,鼠标单击都是鼠标单击。当该语句被实现为 mouseReleased 动作时,鼠标单击的行为似乎发生了变化,但我不明白为什么。

【问题讨论】:

  • 您可能应该使用 mousePressed,而不是 mouseClicked。
  • mapbject.checkDocks 是做什么的?

标签: java swing mouselistener


【解决方案1】:

我不确定这是否是您的问题的根源,因为我不确定您的所有代码都做了什么,但它看起来像是一个潜在的问题:

您可能应该使用 mousePressed 方法覆盖而不是 mouseClicked,尤其是当它与绑定到 mouseReleased 的活动配对时。 mouseClicked 方法意味着鼠标在同一个位置被按下和释放,并且是敏感的,如果你在点击和释放之间移动鼠标,即使是轻微的移动也不会被调用。另一方面,mousePressed 会立即响应 mousePressed,这听起来就像您想要的那样。

也许:

private class MouseHandler extends MouseAdapter {
    @Override
    public void mousePressed(MouseEvent event) {

        statusBar.setText( String.format( "Pressed at [%d, %d]",
            event.getX() , event.getY() ) );
        int x = event.getX();
        int y = event.getY();

        mapObject.updateDockOrShip(x, y,text); //updates selected icon on screen
    }

    @Override
    public void mouseReleased(MouseEvent event) {
        statusBar.setText( String.format( "Released at [%d, %d]",
            event.getX() , event.getY() ) );
        int x = event.getX();
        int y = event.getY();

        /*this is the troubleMaker, if i delete this line all "clicks"
          work everywhere on my JPanel. but if i leave it in, 
          clicks work in some areas of JPanel, and other legitimate clicks
          are recognized as mouseReleased in different area of JPanel
        */

        mapbject.checkDocks(x,y,tempint); //TROUBLE

    }

    // since this extends MouseAdapter, all the other methods are not needed
}

【讨论】:

  • 所以为了注册点击鼠标必须在同一个位置注册一次按下和释放?
  • @ZachSantiago:是的。当你尝试我上面的代码时会发生什么?
  • @ZachSantiago:我喜欢这种情况。
  • 快速问题,如果我想按下一个项目并将其拖动到某个位置,当调用 mouseDragged 时,我如何获得原始压力的来源?
  • @ZachSantiago:你的意思是something like this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2014-02-04
相关资源
最近更新 更多