Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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 GUI类中的堆栈溢出_Java_User Interface_Exception_Reference_Event Handling - Fatal编程技术网

Java GUI类中的堆栈溢出

Java GUI类中的堆栈溢出,java,user-interface,exception,reference,event-handling,Java,User Interface,Exception,Reference,Event Handling,有人能解释一下我为什么会收到错误信息吗 我有两个类,一个是创建GUI的类,另一个是处理事件的类。源代码如下所示 第一类 import javax.swing.*; import java.awt.*; public class Motion extends JFrame { MotionEvent controller = new MotionEvent(); //row 0 JPanel row0 = new JPanel(); //row 1 JPan

有人能解释一下我为什么会收到错误信息吗

我有两个类,一个是创建GUI的类,另一个是处理事件的类。源代码如下所示

第一类

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

public class Motion extends JFrame {

MotionEvent controller = new MotionEvent();

//row 0
JPanel row0 = new JPanel();

//row 1
JPanel row1 = new JPanel();
JButton up = new JButton("Up");

//row 2
JPanel row2 = new JPanel();
JButton left = new JButton("Left");
JButton right = new JButton("Right");
JCheckBox compassFormat = new JCheckBox("compassFormat", false);

//row 3
JPanel row3 = new JPanel();
JButton down = new JButton("down");

Motion(){
    super("Motion Detector");
    setSize(500,325);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout layoutMaster = new GridLayout(5,1,10,10);
    setLayout(layoutMaster);

    add(row0);

    FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER);
    row1.setLayout(layout1);
    up.addActionListener(controller);
    row1.add(up);
    add(row1);

    GridLayout layout2 = new GridLayout(1, 3, 10, 10);
    row2.setLayout(layout2);
    left.addActionListener(controller);
    //compassFormat.addItemListener(controller);
    right.addActionListener(controller);
    row2.add(left);
    row2.add(compassFormat);
    row2.add(right);
    add(row2);

    FlowLayout layout3 = new FlowLayout(FlowLayout.CENTER);
    row3.setLayout(layout3);
    row3.add(down);
    add(row3);

    setVisible(true);

}

public static void main(String[] args){
    Motion createGui = new Motion();
    }
}
第二类

  import java.awt.event.*;
  import javax.swing.*;
public class MotionEvent implements ActionListener/*, ItemListener */{

Motion motionObj = new Motion();

public void actionPerformed(ActionEvent event){
    Object objSource = event.getSource();
    if(objSource == motionObj.up){
        JOptionPane.showMessageDialog(null, "You have moved up");
    }
    else if(objSource == motionObj.down){
        JOptionPane.showMessageDialog(null, "You have moved down");
    }
    else if(objSource == motionObj.left){
        JOptionPane.showMessageDialog(null, "You have moved left");
    }
    else if(objSource == motionObj.right){
        JOptionPane.showMessageDialog(null, "You have moved right", "Navigator", JOptionPane.INFORMATION_MESSAGE);
    }
}

//public void itemStateChanged(ItemEvent event){


}//
收到的错误消息包括:

Exception in thread "main" java.lang.StackOverflowError
at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source)
at java.awt.Window.init(Unknown Source)
at java.awt.Window.<init>(Unknown Source)
at java.awt.Frame.<init>(Unknown Source)
at javax.swing.JFrame.<init>(Unknown Source)
at Motion.<init>(Motion.java:26)
at MotionEvent.<init>(MotionEvent.java:5)
at Motion.<init>(Motion.java:6)
线程“main”java.lang.StackOverflower中出现异常 位于sun.awt.Win32GraphicsConfig.getBounds(本机方法) 位于sun.awt.Win32GraphicsConfig.getBounds(未知源) 位于java.awt.Window.init(未知源) 在java.awt.Window。(未知源) 位于java.awt.Frame。(未知源) 在javax.swing.JFrame。(未知源) 动态。(Motion.java:26) 在MotionEvent。(MotionEvent.java:5) 动态。(Motion.java:6)
Motion.java:6和MotionEvent.java:5引用引用变量的实例化,它们有什么问题吗?

有一个无限循环在运行。意味着
Motion
是无限创建的

每当为
运动
创建对象时,也会为
运动事件
创建对象

public class Motion extends JFrame {

 MotionEvent controller = new MotionEvent();
无论何时创建
MotionEvent
的对象,都会创建
Motion
的对象

  public class MotionEvent implements ActionListener/*, ItemListener */{

  Motion motionObj = new Motion();//which will initiate endless call for this.Remove this
这反过来又会导致这两个对象的无休止的创建,这显然会导致stackoverflow错误。
Remove

这是对
Motion
对象的递归调用。对MotionEvent类使用以下命令

import java.awt.event.*;
  import javax.swing.*;
public class MotionEvent implements ActionListener/*, ItemListener */{
 public void actionPerformed(ActionEvent event){
    Object objSource = event.getActionCommand();
    if(objSource.equals("Up")){
        JOptionPane.showMessageDialog(null, "You have moved up");
    }
    else if(objSource .equals("Down")){
        JOptionPane.showMessageDialog(null, "You have moved down");
    }
    else if(objSource.equals("Left")){
        JOptionPane.showMessageDialog(null, "You have moved left");
    }
    else if(objSource.equals("Right")){
        JOptionPane.showMessageDialog(null, "You have moved right", "Navigator", JOptionPane.INFORMATION_MESSAGE);
    }
}

//public void itemStateChanged(ItemEvent event){


}//

那么,你建议我删除其中一个引用变量吗,controller或motionObj?你必须在MotionEvent中删除它,不需要其他变量。如果它有助于解决问题。我猜这就是问题的原因。我不能将其从MotionEvent类中删除,我必须在ActionPerformed方法中创建引用变量。这很好,我会批准你的回答。出于某种原因,当我点击我的GUI按钮时,它只会打开一个完全相同的GUI弹出窗口。我认为我的事件处理代码工作不正常。其目的是,当按下按钮时,出现一个消息框,说明单击了哪个方向,因此用户按指定方向移动。出于某种原因,当点击一个(J)按钮时,一个新的GUI弹出窗口出现了。是的,我做到了,它工作正常。出于某种原因,当我在GUI上单击一个按钮时,它只会打开一个完全相同GUI的弹出窗口。我认为我的事件处理代码工作不正常。其目的是,当按下按钮时,出现一个消息框,说明单击了哪个方向,因此用户按指定方向移动。出于某种原因,当单击(J)按钮时,会出现一个新的GUI弹出窗口。