如何在Java中的MVC设计中创建视图部分和模型部分之间的关​​系?

时间:2011-01-11 17:58:56

标签: java swing exception

该应用程序是一款小型国际象棋游戏。在我的建模类中,我有一个具有[8] [8]正方形阵列的板类。

现在我所做的是绘制正方形(我不习惯创建GUI,因此它可能完全错误)是我通过两个for循环遍历数组,如下所示:

(这是吸引董事会的班级)

 class Drawboard extends JComponent{
 Board board;
 public Drawboard(){
  repaint();
 }
 public void paint(Graphics g){ 
  for(int i = 0; i < 8; i++){
   for(int j = 0; j < 8; j++){
    int heigth = 20, width = 20;
    g.setColor(board.getSquare(i, j).getColour());
    g.drawRect(i*width, j*heigth, width, heigth);
    g.fillRect(i*width, j*heigth, width, heigth);
   }
  }
 } 
}

'board'变量是我的Game类中Board实例的引用变量(如果这是你引用其他类的方式)

(...这是将绘制的板添加到主视图类中的JPanel的方法)

 public void drawBoard(){
  gamePanel.add(new Drawboard());
 }

这是不好的编码?

我将我的主视图类添加为我的Game类中的对象,主视图类是具有drawBoard()方法的类。但是当我尝试运行应用程序时,它会在控制台(以及一个灰色的实心窗口)中显示:

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at Drawboard.paint(Graphic.java:50)

我不知道为什么会这样,就像我说的那样。我不习惯编写GUI,也不习惯整体编程。

这是迄今为止的整个主视图类:

import java.awt.Graphics;
import java.util.Timer;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Graphic extends JFrame {

 JFrame    gameWindow    = new JFrame("Chess");
 JPanel    gamePanel     = new JPanel();
 JMenuBar  gameMenu      = new JMenuBar();
 JButton   newGame  = new JButton("New game");
 JButton   pauseGame  = new JButton("Pause");
 JButton   actionLog  = new JButton("Action log");
 Timer    timer   = new Timer();

 Graphic(){
  gameWindow.setDefaultCloseOperation(EXIT_ON_CLOSE);
  gameWindow.setSize(180, 200);
  gameWindow.getContentPane().add(gamePanel);
  gameWindow.setVisible(true);
  gamePanel.setVisible(true);
  gameMenu.add(newGame);
  gameMenu.add(pauseGame);
  gameMenu.add(actionLog);
  drawBoard();
 }

 public void drawBoard(){
  gamePanel.add(new Drawboard());
 }


}

另外,如果这是进行绘图的正确方法。如何在Square [] []数组中连接一个绘制到正方形的正方形? 显然,如果点击一个方格,我希望在我的模型类中使用相应的方格。

如果我是对的,就像现在一样,我将无法点击单个方格而只是整个棋盘?看作是一个组成部分。

是否可以创建一个只表示正方形的组件,然后创建该组件的数组?比如drawSquare [] []或者什么。

掌握董事会的主要“游戏”类:

 public class Game {

 @SuppressWarnings("unused")
 public static void main(String[] args) 
   throws ClassNotFoundException, InstantiationException, IllegalAccessException{
  Board board = new Board();
  Graphic view = new Graphic();
 }
}

1 个答案:

答案 0 :(得分:1)

我还没有看完整个问题,但问题似乎在这里

class Drawboard extends JComponent{
 Board board;//un initilized
 .
 ..
 .
 public void paint(Graphics g){ 
   .
   .
    g.setColor(board.getSquare(i, j).getColour());//trying to invoke method on null

   }
  }
 } 
}

使其像

class Drawboard extends JComponent{
     Board board;//un initilized
     public Drawboard() {
         board = new Board();
     }
     .
     ..
     .
     public void paint(Graphics g){ 
       .
       .
        g.setColor(board.getSquare(i, j).getColour());//trying to invoke method on null

       }
      }
     } 
    }