Как мне создать связь между частью представления и частью модели в дизайне MVC в Java? - PullRequest
0 голосов
/ 11 января 2011

Приложение представляет собой небольшую шахматную игру.В моих классах моделирования у меня есть класс доски с массивом квадратов [8] [8].

Теперь, что я сделал, чтобы нарисовать квадраты (я не привык создавать графические интерфейсы, поэтому он может быть полностьюнеправильно) было то, что я перебрал массив с двумя циклами 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' является ссылочной переменнойк экземпляру Board в моем классе Game (если вы так ссылаетесь на другие классы)

(... и это метод, который добавляет нарисованную доску в 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)

Не уверен, почему я получаю это, как я сказал.Я не привык писать графические интерфейсы и довольно плохо знаком с программированием в целом.

Это весь основной класс представления:

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 Ответ

1 голос
/ 11 января 2011

Я не прочитал весь вопрос, но проблема, кажется, здесь

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

       }
      }
     } 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...