【问题标题】:MouseListener for JPanel missing mouseClicked eventsJPanel 的 MouseListener 缺少 mouseClicked 事件
【发布时间】:2010-08-01 14:18:35
【问题描述】:

我有一个 JPanel,我为它创建了一个 MouseListener,我看到了一些我无法解释的行为。

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

mousePressed
mouseReleased
mouseClicked

在某些情况下,我没有看到 mouseClicked 事件触发,我只看到:

mousePressed
mouseReleased

当我点击这些时间时,我认为我没有做任何不寻常的事情。谁能解释为什么我可能看不到 mouseClicked 事件?

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

感谢任何帮助。

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

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);
    }

}

【问题讨论】:

  • 你能贴一些代码吗?
  • 刚刚添加了一个复制问题的类。我认为可能是我的鼠标太敏感了,我在 mousePressed 和 mouseReleased 事件之间收到了 mouseMoved 事件,但是我为 mouseMoved 添加了一个侦听器,我可以复制问题而不会在中间看到 mouseMove。
  • 感谢您提出这个问题以及所有答案。我有完全相同的问题! (可能也是我敏感的鼠标)。

标签: swing event-handling mouseevent jpanel


【解决方案1】:

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

“你会看到一个鼠标释放事件。如果你没有移动鼠标,一个鼠标点击事件会随之而来。”

我刚遇到这个问题。如果您完全移动鼠标,则不会发生单击事件。我真的不知道这个知识有什么好的 mouseClicked 。我通过使用 mouseReleased 并检查鼠标是否在对象内来修复它:

public void mouseReleased(MouseEvent e) {
    if(objectWithListener.contains(e.getPoint())){
        doClickAction();
    }
}

【讨论】:

    【解决方案2】:

    我想我在这里找到了问题。我在 mousePress 和 mouseRelease 之间获得了中间 mouseDragged 事件。 mouseMoved 似乎没有导致问题,但 mouseDragged 确实。

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

    干杯

    -比尔

    【讨论】:

      【解决方案3】:

      我的解决方案如下所示: pointToHex 将鼠标坐标映射到我的视图中对象的标识。如果坐标在单击和释放时映射到同一个对象,我会注册一个单击事件。

      addMouseListener(new MouseAdapter() {
      
                  HexAddress clickedHex = null;
      
                  public void mousePressed(MouseEvent e) {
                      clickedHex = calc.pointToHex(e.getX(), e.getY());
                  }
      
                  public void mouseReleased(MouseEvent e) {
                      if (clickedHex != null && clickedHex.equals(calc.pointToHex(e.getX(), e.getY()))) {
                          mapEventListener.hexClicked(clickedHex);
                          HexMapView.this.repaint();
                      }
                      clickedHex = null;
                  }
              });
      

      【讨论】:

        【解决方案4】:

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

        首先:可能是你的鼠标变老了。我的行为很奇怪,结果是鼠标偶尔会抛出偏离的坐标,然后它会跳回原来的位置。这将给出鼠标拖动事件。尝试不同的鼠标...

        第二:我遇到了一个问题,我需要一个我正在绘制的 jPanel(A),将其设置为另一个 jPanel(B) 内的 BorderLayout.CENTER 布局,该 jPanel(B) 本身位于 jScrollPane 内。

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

        当 jPanel(B) 调整大小时,布局管理器在缩放 (A) 以适合 jPanel(B) 的 CENTER 时没有将 (A) 的尺寸设置为新大小。鼠标单击事件只会在 jPanel(A) 的原始尺寸内单击时触发。我必须手动将 jPanel(A) 的大小设置为其新的缩放尺寸,以便鼠标点击 jPanel(A) 的所有区域。

        【讨论】:

          【解决方案5】:

          在我想要的只是点击事件的情况下,我使用简单的ActionListener 而不是MouseListneractionPerformed 事件确实,对于按钮和类似的东西,就像我们想要点击事件一样被触发,即只要鼠标在释放时与按下时处于相同的控制,@987654324 @ 事件将被触发。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-10-30
            • 1970-01-01
            • 2020-10-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多