我正在引用此链接,但这最终不会解决我的问题(即,我是从其他人的计算机上运行程序的)。 How to deal with "java.lang.OutOfMemoryError: Java heap space" error (64MB heap size)。现在,我有一个具有10x10正方形的游戏板,但是我需要将其增加到100x100,但是当我这样做时,会出现此错误。在避免出现此错误的同时增加游戏板尺寸的最佳方法是什么?当前输出如下,代码应编译并运行。谢谢!

java - 用Java绘制游戏板-LMLPHP

GameBoard类:

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.*;

public class GameBoard {

private final JPanel board = new JPanel(new BorderLayout(3, 3));
private JButton[][] c1squares = new JButton[10][10];
private JPanel c1Board, c2Board;
private final JLabel messagec1 = new JLabel("Player 1 Board");
JToolBar tool = new JToolBar();
Insets Margin = new Insets(0,0,0,0);
int squares = 10;
int space = 100;
ImageIcon icon = new ImageIcon(new BufferedImage(space, space, BufferedImage.TYPE_INT_ARGB));

GameBoard() {
    initializeGui();
}

public final void initializeGui() {

    board.setBorder(new EmptyBorder(5, 5, 5, 5));
    tool.setFloatable(false);
    board.add(tool, BorderLayout.PAGE_START);
    tool.add(messagec1);
    c1Board = new JPanel(new GridLayout(0, 10));
    c1Board.setBorder(new LineBorder(Color.BLACK));
    board.add(c1Board);

    for (int i = 1; i < c1squares.length; i++) {
        for (int j = 0; j < c1squares[i].length; j++) {
            JButton b = new JButton();
            b.setMargin(Margin);
            b.setIcon(icon);
            if ((j % 2 == 1 && i % 2 == 1) || (j % 2 == 0 && i % 2 == 0)) {
                b.setBackground(Color.WHITE);
            } else {
                b.setBackground(Color.BLACK);
            }
            c1squares[j][i] = b;
        }
    }
    for (int i = 1; i < squares; i++) {
        for (int j = 0; j < squares; j++) {
                    c1Board.add(c1squares[j][i]);
        }
    }
public final JComponent getGui() {
    return board;
}
public final JComponent getGui2() {
    return board2;
}
}

BattleShipFinal类:
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;

public class BattleshipFinal {

public static void main(String[] args) {

    GameBoard gb = new GameBoard();
    JFrame frame = new JFrame("Battleship - Server");
    frame.add(gb.getGui());
    frame.setLocationByPlatform(true);
    frame.setMinimumSize(frame.getSize());
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
    frame.setPreferredSize(new Dimension(900,900));
    frame.setMinimumSize(new Dimension(900,900));
    frame.setLocation(50,50);
    frame.pack();
    frame.setVisible(true);

}

}

最佳答案

如果您很好奇,并且为了说明人们在评论中所说的话,可以使用自定义的JPanel绘制正方形。

如果您需要响应鼠标事件,请在面板上添加MouseListener,它将处理选定的正方形(尚未添加该部分,但是selected类内的Square字段是提示)。

我从您的代码中删除了一些内容,只是为了演示此绘画部分。

游戏板 :

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class GameBoard {

    private JPanel board;
    private final Square[][] c1squares = new Square[10][10];

    GameBoard() {
        initializeGui();
    }

    public final void initializeGui() {

        for (int i = 0; i < c1squares.length; i++) {
            for (int j = 0; j < c1squares[i].length; j++) {

                Square square = new Square();

                if ((j % 2 == 1 && i % 2 == 1) || (j % 2 == 0 && i % 2 == 0)) {
                    square.setBackground(Color.WHITE);
                } else {
                    square.setBackground(Color.BLACK);
                }

                c1squares[i][j] = square;
            }
        }

        board = new BoardPanel(c1squares);
        board.setBorder(new EmptyBorder(5, 5, 5, 5));

    }

    public final JComponent getGui() {
        return board;
    }

    private class BoardPanel extends JPanel {

        Square[][] squares;

        public BoardPanel(final Square[][] squares) {

            this.squares = squares;

        }

        @Override
        public void paintComponent(final Graphics g) {

            super.paintComponent(g);

            int width = getWidth();
            int height = getHeight();

            for (int i = 0; i < squares.length; i++) {
                for (int j = 0; j < squares[i].length; j++) {

                    Square currentSquare = squares[i][j];

                    System.out.println("Managing square " + i + "  " + j);

                    g.setColor(currentSquare.getBackground());
                    g.fillRect(i * width / squares.length, j * height / squares.length, width / squares.length,
                            height / squares.length);

                }
            }

        }

    }

    private class Square {

        boolean isSelected;
        Color background;

        public boolean isSelected() {
            return isSelected;
        }

        public void setSelected(final boolean isSelected) {
            this.isSelected = isSelected;
        }

        public Color getBackground() {
            return background;
        }

        public void setBackground(final Color background) {
            this.background = background;
        }

    }

}

战舰决赛
import java.awt.Dimension;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class BattleshipFinal {

    public static void main(final String[] args) {

        GameBoard gb = new GameBoard();
        JFrame frame = new JFrame("Battleship - Server");
        JComponent board = gb.getGui();
        frame.add(board);
        frame.setLocationByPlatform(true);
        //frame.setMinimumSize(frame.getSize());
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        //frame.setPreferredSize(new Dimension(100, 100));
        board.setMinimumSize(new Dimension(100, 100));
        board.setPreferredSize(new Dimension(100, 100));
        frame.setMinimumSize(new Dimension(100, 100));
        frame.setLocation(50, 50);
        frame.pack();
        frame.setVisible(true);

    }

}

10-08 19:55