Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试分派MouseeEvents时发生Stackoverflow错误。mousemoded可以工作,但mouseDragged不能_Java_Mousemove_Stack Overflow_Mousemotionevent - Fatal编程技术网

Java 尝试分派MouseeEvents时发生Stackoverflow错误。mousemoded可以工作,但mouseDragged不能

Java 尝试分派MouseeEvents时发生Stackoverflow错误。mousemoded可以工作,但mouseDragged不能,java,mousemove,stack-overflow,mousemotionevent,Java,Mousemove,Stack Overflow,Mousemotionevent,我一直在尝试实现鼠标运动事件调度,但仍然出现堆栈溢出错误。它适用于mouseMoved(MouseEvent e)方法,但不适用于mouseDragged(MouseEvent e)。有人知道为什么吗?有什么解决办法吗 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JFrame { public Test() { setLayout(null);

我一直在尝试实现鼠标运动事件调度,但仍然出现堆栈溢出错误。它适用于mouseMoved(MouseEvent e)方法,但不适用于mouseDragged(MouseEvent e)。有人知道为什么吗?有什么解决办法吗

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

public class Test extends JFrame {

public Test() { 
    setLayout(null);
    setSize(500,500);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    addMouseMotionListener(new MouseMotionListener() {
         public void mouseMoved(MouseEvent e) {
             System.err.println("moved outside");
         }
         public void mouseDragged(MouseEvent e) {
            System.err.println("dragged outside");
         }
    });

    JPanel inside = new JPanel();
    inside.setLocation(0, 0);
    inside.setSize(100, 100);
    inside.setBackground(Color.RED);

    inside.addMouseMotionListener(new MouseMotionListener() {
        public void mouseDragged(MouseEvent e) {
            System.out.println("dragged inside");

            //The error occurs here when I begin dragging 
            //here and continue dragging to any other location.

            Test.this.dispatchEvent(e);
        }
        public void mouseMoved(MouseEvent e) {
            System.out.println("moved inside");
            Test.this.dispatchEvent(e);
        }
    });
    add(inside);
}

public static void main(String[] args) {
    Test client = new Test();
}
}
我的实际项目使用了许多内部组件,我的目标是让每个组件实现它们自己的鼠标按下/单击/释放动作,并使框架控制鼠标移动和拖动,从而影响所有组件

下面是一个类似的代码,适用于两种鼠标运动方法

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

public class Test2 {

public static void main(String... args) {
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            final JComponent outside = new JPanel();
            JComponent inside = new JPanel();
            inside.setBackground(Color.red);
            inside.setPreferredSize(new Dimension(200, 200));
            inside.addMouseMotionListener(new MouseAdapter() {
                public void mouseDragged(MouseEvent e) {
                    System.out.println("dragged inside");
                    outside.dispatchEvent(e);
                }
                public void mouseMoved(MouseEvent e) {
                    System.out.println("moved inside");
                    outside.dispatchEvent(e);
                }
            });

            outside.add(inside);
            outside.setPreferredSize(new Dimension(300, 300));
            outside.addMouseMotionListener(new MouseAdapter() {
                public void mouseMoved(MouseEvent e) {
                    System.err.println("moved outside");
                }
                public void mouseDragged(MouseEvent e) {
                    System.err.println("dragged outside");
                }
            });

            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(outside);
            frame.pack();
            frame.setVisible(true);
        }
    });
}
}

非常感谢您的帮助。

您的
中的
鼠标表情监听器
正在生成一个新事件。同一个
MouseMotionListener
将再次捕获该事件,从而创建一个无休止的循环。由于您正在创建一个事件,而上一个事件尚未完成,因此它们将一直叠加,直到
stackoverflowerrror
爆炸您的应用程序


您的第二个代码没有这个问题,因为
内部
委托给
外部
并在那里结束

在第一段代码中,为什么调用相同的MouseMotionListener?正在使用Test.this in Test.this.dispatchevent(e);问题出在哪里?我不明白为什么它和mouseMoved一起工作。我注意到当使用mouseMoved时,与第二个代码相比,“moved in”弹出的远多于“moved out”。在第一个代码中有两个
MouseMotionListener
s。鼠标在
内部的
面板上移动。两个侦听器都将启动,因为鼠标在面板和窗口上移动。
监听器内部的
创建一个新事件并将其发布到Swing,Swing会将其传递给两个监听器。
监听器内部的
创建一个新事件并将其发布到Swing,Swing会将其传递给两个监听器。
监听器内部的
创建一个新事件并将其发布到Swing,Swing会将其传递给两个监听器。
内部的
监听器创建一个新事件并将其发布到Swing,Swing将它传递给两个监听器。。。繁荣