2016-11-22 57 views
2

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

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

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

} 

} 
+0

你需要增加你堆大小http://stackoverflow.com/questions/6452765/how-to-increase-heap-size- of-jvm – barna10

+0

所以你希望有一个有10,000个按钮的框架? (100x100)? 我会建议不要使用按钮,但有一个绘制区域与'虚拟'按钮。您可以通过使用鼠标坐标确定玩家点击哪个“按钮”(方块)。 – jr593

+0

...或者重建方法,因为jr593建议 – barna10

回答

1

如果你很好奇,并说明在评论的人说的话,你可以有一个自定义的JPanel画正方形。

如果你需要响应鼠标事件,添加MouseListener到面板上,这将照顾到选定的方块(没有添加的那部分,但Square类中的selected场是一个提示)。

我从代码中删除了东西,只是为了演示此绘画部分。

游戏键盘:

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

    } 

} 

BattleshipFinal:

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

    } 

} 
0

好的,我想出这样做的解决方案。下面是输出:

enter image description here

我固定的方式,这是通过改变这些代码:

private JButton[][] c1squares = new JButton[100][100]; 
int squares = 100; 
int space = 1000; 
c1Board = new JPanel(new GridLayout(0, 100));