Проблема с вызовом методов repaint () и paintComponent () с использованием шаблона проектирования mvc - PullRequest
0 голосов
/ 15 апреля 2011

Я создаю маленькую игру, вы нажимаете кнопки (вверх, вниз, влево и вправо), чтобы управлять кошкой (представленной прямоугольником), чтобы преследовать мышь (представляемую другим прямоугольником).Хм, я знаю ... в любом случае, я использую шаблон проектирования mvc, и у меня возникают проблемы с вызовом метода перерисовки от слушателей кнопок в контроллере на панели, где два прямоугольника должны быть «нарисованы».Они рисуют успешно в первый раз, но не дальше.

Я реализовал метод paintComponent () двумя способами, но оба не работали

  1. Создайте отдельный классэто расширяет JPanel и выполняет бизнес paintComponent, создавая новый объект этого класса в представлении и используя его для рисования прямоугольников.
  2. Создание JPanel и запись материала paintComponent в круглых скобках нового объекта JPanel.

, и я реализовал код в контроллере для перерисовки двумя способами, и обане работает

  1. Вызовите метод из представления, которое возвращает jpanel, использующий метод paintComponent, и вызовите для него функцию repaint.
  2. Создание jpanel в контроллере и назначение панелииз представления к нему, затем вызывая repaint для этого.

Код для представления и контроллера (который долго, извините!) находится ниже, он также включает закомментированный материал, который я не смог получитьработать от двух методов до решения проблемы, упомянутой ранее ...

View

/ * * gameView.java * /

package game;

import java.АВТ .import java.awt.event. ;import javax.swing. *;

открытый класс gameView extends JFrame {

//components
private JButton up = new JButton("Up");
private JButton down = new JButton("Down");
private JButton left = new JButton("Left");
private JButton right = new JButton("Right");
//panels
private JPanel content = new JPanel();
//boardPanel leftPanel = new boardPanel();
private Stroke drawingStroke = new BasicStroke(1);

private JPanel leftPanel = new JPanel(){
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponents(g);
        myPaint(g);
        }
};
private JPanel rightPanel = new JPanel();
//model
private gameModel model;
//mouse and cat
private Rectangle cat;
private Rectangle mouse;

public void myPaint(Graphics g){

    Graphics2D g1 = (Graphics2D)g;
    Graphics2D g2 = (Graphics2D)g;

    g1.setStroke(drawingStroke);
    g1.draw(cat);
    g1.setPaint(Color.yellow);
    g1.fill(cat);

    g2.setStroke(drawingStroke);
    g2.draw(mouse);
    g2.setPaint(Color.red);
    g2.fill(mouse);
}

//constructor
public gameView(gameModel _model){
    model = _model;
    //cat and mouse
    cat = new Rectangle(_model.getCatX(), _model.getCatY(), 10, 10);
    mouse = new Rectangle(_model.getMouseX(), _model.getMouseY(), 10, 10);
    //layout
    content.setSize(500, 400);
    content.setLayout(new GridLayout(0,2));

    leftPanel.setSize(200, 200);
    leftPanel.setBackground(Color.blue);

    rightPanel.setSize(100, 400);
    rightPanel.setLayout(new FlowLayout());
    rightPanel.add(new JLabel("Controls"));
    rightPanel.add(up);
    rightPanel.add(down);
    rightPanel.add(left);
    rightPanel.add(right);

    content.add(leftPanel);
    content.add(rightPanel);

    this.setSize(500, 400);
    this.setContentPane(content);
    this.setTitle("Cat & Mouse Game");
}
//returns the leftPanel to repaint in the controller
public JPanel getLeft(){
    return leftPanel;
}

//listeners for buttons
public void addUpListener(ActionListener moveUp){
    up.addActionListener(moveUp);
}
public void addDownListener(ActionListener moveDown){
    down.addActionListener(moveDown);
}
public void addLeftListener(ActionListener moveLeft){
    left.addActionListener(moveLeft);
}
public void addRightListener(ActionListener moveRight){
    right.addActionListener(moveRight);
}
public void addCloseListener(WindowListener close){
    this.addWindowListener(close);
}
//
public Rectangle getCat(){
    return cat;
}
public Rectangle getMouse(){
    return mouse;
}
//left side board panel
/*class boardPanel extends JPanel{
    Stroke drawingStroke = new BasicStroke(1);
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g1 = (Graphics2D)g;
        g1.setStroke(drawingStroke);
        g1.draw(cat);
        g1.setPaint(Color.yellow);
        g1.fill(cat);

        Graphics2D g2 = (Graphics2D)g;
        g2.setStroke(drawingStroke);
        g2.draw(mouse);
        g2.setPaint(Color.red);
        g2.fill(mouse);
    }
}
public JPanel getLeft(){
    return leftPanel;
}*/

}

Controller

/ * * gameController.java * /пакет игры;

import java.awt.event. ;import javax.swing. ;

публичный класс gameController {

private gameModel model;
private gameView view;
private JPanel lp = new JPanel();

public gameController(gameModel _model, gameView _view){
    model = _model;
    view = _view;

    lp=_view.getLeft();

    //listeners
    view.addUpListener(new UpListener());
    view.addDownListener(new DownListener());
    view.addLeftListener(new LeftListener());
    view.addRightListener(new RightListener());
    view.addCloseListener(
        new WindowAdapter(){
              public void windowClosing(WindowEvent we){
                  System.exit(0);
                  }
        });
}
//DOWN
class DownListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        model.setCatY((model.getCatY()+10));
        //do a random move for the mouse
        //model.randomMove();
        //view.getLeft().repaint();
        lp.repaint();
        System.out.println("x="+model.getCatX()+"y="+model.getCatY());
    }
}
//LEFT
class LeftListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        model.setCatY((model.getCatY()-10));
        //do a random move for the mouse
        //model.randomMove();
        //view.getLeft().repaint();
        lp.repaint();
        System.out.println("x="+model.getCatX()+"y="+model.getCatY());
    }
}
//RIGHT
class RightListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        model.setCatY((model.getCatY()+10));
        //do a random move for the mouse
        //model.randomMove();
        //view.getLeft().repaint();
        lp.repaint();
        System.out.println("x="+model.getCatX()+"y="+model.getCatY());
    }
}

}

1 Ответ

0 голосов
/ 15 апреля 2011

Похоже, что ваши слушатели кнопок обновляют модель, но на самом деле ничего не обновляет координаты прямоугольников кота и мыши.Они получают свои начальные границы от модели, но затем никогда не обновляются.

Представление, вероятно, должно прослушивать модель, чтобы синхронизировать местоположение кошки-мышки с фактическими объектами Rectangle.

...