java - 在java中绘制游戏板

标签 java jframe

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

enter image description here

游戏板类:

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;
}
}

战舰最终类:

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 绘制方 block 。

如果您需要响应鼠标事件,请将 MouseListener 添加到您的面板,它将处理选定的方 block (尚未添加该部分,但 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);

    }

}

关于java - 在java中绘制游戏板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40746687/

相关文章:

java - 特定 div 的页面抓取

java - Spring 中的 JDBC 模板给出异常

Java JFrame 绘制多行

java - 建立JFrame的语法。哪个是对的?

Java 编程,JFrame 问题

java - 为什么我们不能一次从 System.in 中读取一个字符?

java - 如何在Java中打印长原语

java - Hibernate 不创建表但也不会抛出错误

java - JPanel内容不显示

java - 无法将 JTextField 添加到 JFrame