2014-02-17 27 views
1

所以我的计划是建立一个史密斯先生类型的游戏,我想,当我按我的箭平方(这将是飞船后)改变X; Y位置。 我们设法测试了keylistener的工作原理,所以我们确信问题来自repaint函数。如何在使用Keylistener后重新绘制图形?

请帮助,这里是我们的代码:

类N°1

import java.awt.Color; 


import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

import java.awt.Dimension; 

import javax.swing.JFrame; 

public class Fenetre extends JFrame implements KeyListener { 
Panneau pan = new Panneau(); 
    public Fenetre(){    
    //nom de la fenetre 
    this.setTitle("Projet"); 
    //taille 
    this.setSize(450, 600); 
    //centrer la fenetre 
    this.setLocationRelativeTo(null); 
    //Fenetre toujours en premier plan 
    this.setAlwaysOnTop(true); 
    //arrêt du processus à la fermeture de la fenêtre 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //Fenetre non redimensionnable 
    this.setResizable(false); 
    //Couleur du fond 
    this.setBackground(Color.DARK_GRAY); 

    //Instanciation d'un objet JPanel 
    JPanel pan = new JPanel(); 
    JPanel tir = new JPanel(); 
    //On prévient notre JFrame que notre JPanel sera son content pane 
    this.setContentPane(new Panneau()); 

    this.setVisible(true); 
    this.addKeyListener(this); 
    } 
@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void keyPressed(KeyEvent e) { 
    // TODO Auto-generated method stub 
    int c = e.getKeyCode(); 
     if(c==KeyEvent.VK_RIGHT){ 
      int x = pan.getPosX(); 
      x=x+10; 
      pan.setPosX(x); 
      pan.repaint(); 
      System.out.print("Droite ");} 
     if(c==KeyEvent.VK_LEFT){ 
      int x = pan.getPosX(); 
      x=x-10; 
      pan.setPosX(x); 
      pan.repaint(); 
      System.out.print("Gauche ");} 
     if(c==KeyEvent.VK_UP){ 
      int y = pan.getPosY(); 
      y=y+10; 
      pan.setPosY(y); 
      pan.repaint(); 
      System.out.print("Haut ");} 
     if(c==KeyEvent.VK_DOWN){ 
      int y = pan.getPosY(); 
      y=y-10; 
      pan.setPosY(y); 
      pan.repaint(); 
      System.out.print("Bas ");} 
     if(c==KeyEvent.VK_SPACE){ 
      this.setBackground(Color.CYAN); 



     } 


} 
@Override 
public void keyReleased(KeyEvent e) { 
    // TODO Auto-generated method stub 
    int c = e.getKeyCode(); 
    if(c==KeyEvent.VK_SPACE){ 
     this.setBackground(Color.DARK_GRAY);} 
} 





} 

类N°2

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JPanel; 

import java.awt.Graphics; 

import javax.swing.JPanel; 

import java.awt.Graphics; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 

public class Panneau extends JPanel { 

    public int posX = 450/2-15; 
    public int posY = 500; 

public void paintComponent(Graphics g){ 
    g.setColor(Color.red); 
    g.fillRect(posX, posY, 30, 30); 
    System.out.print("Carré "); 
} 
    public int getPosX() { 
    return posX; 
    } 
    public void setPosX(int posX) { 
    this.posX = posX; 
    } 
    public int getPosY() { 
    return posY; 
    } 
    public void setPosY(int posY) { 
    this.posY = posY; 
    }   

} 

,我们的主要:

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 


public class Main extends JFrame { 
public static void main (String [] Args){ 
    Fenetre fen = new Fenetre(); 


}} 

PS:我们是初学者,所以我们可能会做定义一个可怕的很多事情错

回答

1

随着

Panneau pan = new Panneau(); 

要创建这是在keyPressed方法修改的Panneau实例。但随着

this.setContentPane(new Panneau()); 

要添加的Panneau一个实例的框架 - 这个实例修改了keyPressed方法。

有与代码其他一些问题,但最小变化是必要以实现期望的效果是此行更改为

this.setContentPane(this.pan); 

为了清除面板的背景(即,删除以前画矩形),您还可以拨打super.paintComponent(g)paintComponent方法的第一行:

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.setColor(Color.red); 
    g.fillRect(posX, posY, 30, 30); 
    System.out.print("Carré "); 
} 
+0

只是一个问题,将super.paint将相冲突,我们希望以后添加的导弹进入那?因为我看到这个命令清理所有的窗口,然后添加广场? Tahnks反正它的工作:) – user3266582

+0

当你画的导弹** **后调用'super.paintComponent',那么就不会有问题。请注意,您要绘制的* everything *必须绘制在'paintComponent'方法中(或者从'paintComponent'调用并接收相同的'Graphics'对象的方法中)。 (所以如果你打算在任何地方调用'getGraphics':**不要这样做**)。另请参阅http://docs.oracle.com/javase/tutorial/uiswing/painting/ – Marco13