【问题标题】:Problem with calling repaint() and paintComponent() method, using mvc design pattern使用 mvc 设计模式调用 repaint() 和 paintComponent() 方法的问题
【发布时间】:2011-08-06 11:33:49
【问题描述】:

我正在创建一个小游戏,你点击按钮(上、下、左、右)来控制一只猫(用一个矩形表示)去追逐一只老鼠(用另一个矩形表示)。跛脚我知道......无论如何,我正在使用 mvc 设计模式,并且我在从面板上要“绘制”两个矩形的控制器中的按钮侦听器中调用 repaint 方法时遇到问题。他们第一次绘制成功,但以后就不行了。

我已经通过两种方式实现了 paintComponent() 方法,但都不起作用

  1. 创建一个单独的类来扩展 JPanel 并执行paintComponent 业务,在视图中创建该类的新对象并使用它来绘制矩形。
  2. 创建一个 JPanel 并在新 JPanel 对象的括号中写入 paintComponent 内容。

我已经在控制器中实现了代码以两种方式重新绘制,但都没有工作

  1. 从返回 jpanel 的视图中调用方法,该 jpanel 使用 paintComponent 方法并对其调用 repaint。
  2. 在控制器中创建一个 jpanel 并将视图中的面板分配给它,然后对其调用 repaint。

视图和控制器的代码(很长,抱歉!)在下面,它还包括注释掉的东西,我无法通过两种方法来解决前面提到的问题......

View

/* * 游戏视图.java */

打包游戏;

导入 java.awt.; 导入 java.awt.event.; 导入 javax.swing.*;

公共类gameView扩展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;
}*/

}

控制器

/* * 游戏控制器.java */ 打包游戏;

导入 java.awt.event.; 导入 javax.swing.;

公共类游戏控制器 {

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

}

【问题讨论】:

    标签: java model-view-controller awt repaint paintcomponent


    【解决方案1】:

    看起来您的按钮侦听器更新了模型,但实际上并没有更新猫和鼠标矩形的坐标。它们从模型中获得初始边界,但随后永远不会更新。

    视图可能应该听模型以将猫和老鼠的位置同步到实际的 Rectangle 对象。

    【讨论】:

    • 太好了,我编写了一个小方法来使用 Rectangle setLocation(x,y) 方法更新矩形的坐标。还有一些问题需要解决,但至少我正在解决一些问题。感谢您对 CarlG 的帮助,更感谢您阅读我所有的代码!
    • 任何关于如何摆脱矩形移动后留下的痕迹的快速想法?
    • 我没有运行你的代码,但如果它留下痕迹,那么你可能没有在绘制矩形之前清除面板。这很奇怪,一个不透明的 JPanel 的 super.paintComponent() 应该为你绘制它的背景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2017-01-03
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多