小さなゲームを作成しているときに、ボタン(上、下、左と右)をクリックして猫(別の長方形で表される)マウスを追跡します。私は知っている...とにかく私はmvcのデザインパターンを使用していると私は2つの長方形が描画されるパネル上のコントローラ内のボタンリスナーからrepaintメソッドを呼び出す際に問題が発生しています。彼らは初めて成功裏にペイントしますが、これ以上の時間はありません。mvcデザインパターンを使用してrepaint()とpaintComponent()メソッドを呼び出す際の問題
私は2つの方法でpaintComponent()メソッドを実装しましたが、両方が
- がでそのクラスの新しいオブジェクトを作成し、JPanelのを拡張し、paintComponent事業を行う独立したクラスを作成して動作しませんでしたビューを作成し、それを使用して長方形をペイントします。
- JPanelを作成し、新しいJPanelオブジェクトのかっこ内にpaintComponentを書き込む。
と私は2つの方法で再描画するために、コントローラでのコードを実装しましたし、両方が動作しませんでした
- はpaintComponentメソッドを使用してのJPanelを返すビューからメソッドを呼び出し、それについての再描画を呼び出す。
- コントローラーでjpanelを作成し、そのパネルをビューに割り当ててからrepaintを呼び出します。
ビューとコントローラのコード(長いです、申し訳ありません!)以下である、それはまた、私は前に述べた問題にアプローチするには、2つの方法から動作させることができなかったコメントアウトものを含んでいます。.. 。
View
/* * gameView.java */
パッケージゲーム。
import java.awt。 ; import java.awt.event。; import javax.swing。*;
パブリッククラスgameViewは{
//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;
}*/
}
コントローラ
/* * gameController.java */ パッケージゲームのJFrameを拡張します。
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());
}
}
}
私は、Rectangle setLocation(x、y)メソッドを使用して矩形の座標を更新する小さなメソッドを作成しました。整理するにはまだいくつかの問題がありますが、少なくとも私は何かをしています。あなたのお役に立ってくれてありがとうございましたCarlG、そして私のコード全体を読むためにもっと! – haakym
移動したらどのように矩形が後ろに残るトレイルを取り除くことができますか? – haakym
私はあなたのコードを実行していませんが、それは歩道を残している場合、あなたはおそらく、rectをペイントする前に、パネルをクリアしていないでしょう。 Thats odd b/c不透明なJPanelのsuper.paintComponent()は、背景をペイントする必要があります。 – CarlG