线程中的异常" AWT-EventQueue-0"发生java.lang.StackOverflowError

时间:2015-12-04 18:55:56

标签: java swing arraylist

我正在尝试制作一个在键入特定键时打破拼贴的游戏。

首先,这是异常。

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)
    at sun.nio.cs.UTF_8.access$200(UTF_8.java:57)
    at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:636)
    at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:691)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
    at java.io.PrintStream.newLine(PrintStream.java:545)
    at java.io.PrintStream.println(PrintStream.java:807)
    at code.gui.NewView.addTileToDelete(NewView.java:192)
    at code.gui.NewView.deleteTileByColor(NewView.java:151)
    at code.gui.NewView.deleteTileByColor(NewView.java:158)
    at code.gui.NewView.deleteTileByColor(NewView.java:152)

如果我执行一次deleteTileByColor方法,它运行正常, 但是从第二次开始,出现上述错误。 这是游戏的代码。

package code.gui;


import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.Collections;

import javax.swing.BorderFactory;
import javax.swing.JFrame;

import code.handlers.PressKeyHandler;
import code.model.DataModel;
import code.parts.GamePanel;
import code.parts.GameTile;

public class NewView extends JFrame {
    int _exitCounter;
    int _tileDeleteCounter;
    int _column = 4;
    int _row = 4;

    GamePanel _gamePanel;
    DataModel _dm;
    GameTile _tile;

    ArrayList<ArrayList<GameTile>> _gameTileList = new ArrayList<ArrayList<GameTile>>();
    ArrayList<GamePanel> _gamePanLst = new ArrayList<GamePanel>();
    ArrayList<Character> _letterList;

    public NewView(DataModel dm) {
        super("Sequence Game");
        this._dm = dm;

        setLayout(new GridLayout(1, 4));

        shuffleLetter();

        for (int i = 0; i < _column; i++) {
            _gamePanel = new GamePanel();
            System.out.println("1. _gameTileList에 new ArrayList 총 " + i + "개 추가");
            for (int j = 0; j < _row; j++) {
                _tile = new GameTile(_letterList.get((4 * i) + j));
                _gamePanel.add(_tile);
                _tile.addKeyListener(new PressKeyHandler(_dm));
            }
            _gamePanLst.add(_gamePanel);
        }
        System.out.println("어레이 리스트<어레이리스트> 사이즈 : " + _gameTileList.size());
        setFrame();

        this.setSize(300, 500);
        this.setVisible(true);

        this.add(_gamePanel);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        _dm.setView(this);
    }

    public void setFrame() {
        for (int i = 0; i < _gamePanLst.size(); i++) {
            this.add(_gamePanLst.get(i), i);
        }
        this.repaint();
        this.revalidate();
    }

    public void update(char letter) {
        resetTileArrLst();

        Color tileColor;
        for (int i = 0; i < _column; i++) {
            for (int j = 0; j < _row; j++) {
                if (_gamePanLst.get(i).getComponent(j).getName().equals("" + letter)) {
                    System.out.println("i : " + i + " / j : " + j);
                    // System.out.println("최초비교");
                    tileColor = setTileColor(_gamePanLst.get(i).getComponent(j));
                    addTileToDelete(i, j);
                    deleteTileByColor(i, j, tileColor);
                }
            }
        }

        checkToQuit();
        setFrame();
    }

    public void shuffleLetter() {
        ArrayList<Character> temp = new ArrayList<Character>();
        int numOfLetters = 26;
        for (int i = 0; i < numOfLetters; i++) {
            temp.add((char) (97 + (i)));
        }
        Collections.shuffle(temp);
        _letterList = temp;

    }

    public Color setTileColor(Component comp) {
        System.out.println("**********setTileColor**********    ");
        System.out.println("compo color  : " + comp.getBackground());
        Color temp;

        if (comp.getBackground().equals(Color.RED)) {
            temp = Color.RED;
        } else if (comp.getBackground().equals(Color.BLUE)) {
            temp = Color.BLUE;
        } else if (comp.getBackground().equals(Color.YELLOW)) {
            temp = Color.YELLOW;
        } else {
            temp = Color.GREEN;
        }
        return temp;
    }

    public GameTile getEmptyTile() {
        GameTile emptyTile = new GameTile(' ');
        emptyTile.setBorder(BorderFactory.createEmptyBorder());
        emptyTile.setBackground(Color.BLACK);
        emptyTile.addKeyListener(new PressKeyHandler(_dm));

        return emptyTile;
    }

    public void checkToQuit() {
        int counter = 0;
        for (int i = 0; i < _gamePanel.getComponentCount(); i++) {
            if (_gamePanel.getComponent(i).getBackground() == Color.BLACK) {
                counter++;
            }
        }
        if (counter == _gamePanel.getComponentCount()) {
            this.dispose();
        }
    }

    public void deleteTile(int i) {
        _gamePanel.remove(i);
        _gamePanel.add(getEmptyTile(), i);
    }

    public void deleteTileByColor(int column, int row, Color tileColor) {

        // Right
        if (((column + 1) < 4) && tileColor == (_gamePanLst.get((column + 1)).getComponent(row).getBackground())) {
            column = column + 1;
            addTileToDelete(column, row);
            deleteTileByColor(column, row, tileColor);
        }
        // Left
        if ((column - 1 >= 0) && tileColor == (_gamePanLst.get(column - 1).getComponent(row).getBackground())) {
            column = column - 1;
            addTileToDelete(column, row);
            deleteTileByColor(column, row, tileColor);
        }
        // Below
        if ((row + 1 < 4) && tileColor == (_gamePanLst.get(column).getComponent(row + 1).getBackground())) {
            row = row + 1;
            addTileToDelete(column, row);
            deleteTileByColor(column, row, tileColor);
        }
        // Above
        if ((row - 1 >= 0) && tileColor == (_gamePanLst.get(column).getComponent(row - 1).getBackground())) {
            row = row - 1;
            addTileToDelete(column, row);
            deleteTileByColor(column, row, tileColor);
        }

        moveDownTiles();

    }

    public void moveDownTiles() {
        for (int i = 0; i < _column; i++) {
            for (int j = 0; j < _row; j++) {
                if (_gamePanLst.get(i).getComponent(j).equals(_gameTileList.get(i).get(j))) {
                    _gamePanLst.get(i).remove(j);
                    _gamePanLst.get(i).add(getEmptyTile(), 0);
                }
            }
        }
        resetTileArrLst();

    }

    public void addTileToDelete(int column, int row) {
        _gameTileList.get(column).set(row, (GameTile) _gamePanLst.get(column).getComponent(row));
        System.out.println("지울 타일 추가 완료 : " + _gamePanLst.get(column).getComponent(row).getName());
    }

    public int get_exitCounter() {
        return _exitCounter;
    }

    public void set_exitCounter(int _exitCounter) {
        this._exitCounter = _exitCounter;
    }

    public GamePanel get_gamePanel() {
        return _gamePanel;
    }

    public void set_gamePanel(GamePanel _gamePanel) {
        this._gamePanel = _gamePanel;
    }

    public ArrayList<ArrayList<GameTile>> get_gameTilesList() {
        return _gameTileList;
    }

    public void set_gameTilesList(ArrayList<ArrayList<GameTile>> _gameTilesList) {
        this._gameTileList = _gameTilesList;
    }

    public ArrayList<Character> get_letterList() {
        return _letterList;
    }

    public void set_letterList(ArrayList<Character> _letterList) {
        this._letterList = _letterList;
    }

    public ArrayList<GamePanel> get_gamePanLst() {
        return _gamePanLst;
    }

    public void set_gamePanLst(ArrayList<GamePanel> _gamePanLst) {
        this._gamePanLst = _gamePanLst;
    }

    public void resetTileArrLst() {

        if (_gameTileList.size() != 0) {
            _gameTileList.clear();
        }
        for (int i = 0; i < _column; i++) {
            _gameTileList.add(i, new ArrayList<GameTile>());
            for (int j = 0; j < _row; j++) {
                _gameTileList.get(i).add(getEmptyTile());
            }
        }

    }
}

0 个答案:

没有答案