Java 尝试分派MouseeEvents时发生Stackoverflow错误。mousemoded可以工作,但mouseDragged不能
我一直在尝试实现鼠标运动事件调度,但仍然出现堆栈溢出错误。它适用于mouseMoved(MouseEvent e)方法,但不适用于mouseDragged(MouseEvent e)。有人知道为什么吗?有什么解决办法吗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);
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将它传递给两个监听器。。。繁荣