-1

作成したこの短いプログラムを実行すると、スタックオーバーフローエラーが発生し続けます。助けてください!今のところ、ユーザーが入力して自分の位置(X座標とY座標)を印刷するだけです。スタックオーバーフローエラーとは何か、またはそれを修正する方法がわかりません。

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

public class ExplorerPanel extends JFrame {

    ExplorerEvent prog = new ExplorerEvent(this);

    JTextArea dataa = new JTextArea(15, 20);
    JTextField datain = new JTextField(20);
    JButton submit = new JButton("Submit");
    JTextField errors = new JTextField(30);

    public ExplorerPanel() {
        super("Explorer RPG");
        setLookAndFeel();
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_…
        BorderLayout bord = new BorderLayout();
        setLayout(bord);

        JPanel toppanel = new JPanel();
        toppanel.add(dataa);
        add(toppanel, BorderLayout.NORTH);

        JPanel middlepanel = new JPanel();
        middlepanel.add(datain);
        middlepanel.add(submit);
        add(middlepanel, BorderLayout.CENTER);

        JPanel bottompanel = new JPanel(); 
        bottompanel.add(errors);
        add(bottompanel, BorderLayout.SOUTH);

        dataa.setEditable(false);
        errors.setEditable(false);

        submit.addActionListener(prog);

        setVisible(true);
    }

    private void setLookAndFeel() {
        try {
            UIManager.setLookAndFeel(
                                   "com.sun.java.swing.plaf.nimbus.NimbusLo…
            );
        } catch (Exception exc) {
            // ignore error
        }
    }

    public static void main(String[] args) {
        ExplorerPanel frame = new ExplorerPanel();
    }

}

public class ExplorerEvent implements ActionListener, Runnable {

    ExplorerPanel gui;
    Thread playing;
    String command;
    String gamedata;
    ExplorerGame game = new ExplorerGame();

    public ExplorerEvent(ExplorerPanel in) {
        gui = in;
    }

    public void actionPerformed(ActionEvent event) {
        String command = event.getActionCommand();
        if (command.equals("Submit")) {
            startPlaying();
        }
    }

    void startPlaying() {
        playing = new Thread(this);
        playing.start();
    } 

    void stopPlaying() {
        playing = (null);
    }

    void clearAllFields() {
        gui.dataa.setText("");
    }

    public void run() {
        Thread thisThread = Thread.currentThread();
        while (playing == thisThread) {

            // Game code
            game.Game();

        }
    }

}

public class ExplorerGame {

    ExplorerPanel gui = new ExplorerPanel();
    String command;
    int x = 1;
    int y = 1;

    public void Game() {
        command = gui.submit.getText().toLowerCase();

        if (command.equals("east")) {x--;}
        else if (command.equals("south")) {y--;}
        else if (command.equals("west")) {x++;}
        else if (command.equals("north")) {y++;}
        System.out.println(x + y);
    }
}
4

1 に答える 1

6

ExplorerGameで、次のように宣言しました:-

ExplorerPanel gui = new ExplorerPanel();

次に、ExplorerPanelで:-

ExplorerEvent prog = new ExplorerEvent(this);

そして再び、ExplorerEventで:-

ExplorerGame game = new ExplorerGame();

これにより、スタックがオブジェクトの再帰的な作成でいっぱいになります。

ExplorerGame -> ExplorerPanel -> ExplorerEvent --+
    ^                                            |
    |____________________________________________|

問題を解決したいですか?私はあなたに提案します:-

  • コードを破棄し、アプリケーションを再設計します。アプリケーションにを含めることcyclic dependencyは大きな抜け穴であり、非常に貧弱な設計を示しています。
于 2012-10-23T16:32:14.563 に答える