【问题标题】:How to repaint graphics after using a Keylistener?使用 Keylistener 后如何重新绘制图形?
【发布时间】:2014-03-16 22:03:49
【问题描述】:

所以我的项目是创建一个射击游戏类型的游戏,我希望当我按下箭头时,我的方块(这将是宇宙飞船)改变 x;y 位置。 我们设法测试了 keylistener 的工作原理,因此我们确定问题出在 repaint 函数上。

请帮忙,这是我们的代码:

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





 }

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:我们是初学者,所以我们可能做错了很多事情

【问题讨论】:

    标签: java swing graphics keylistener repaint


    【解决方案1】:

    Panneau pan = new Panneau();
    

    您正在创建Panneau 的实例,该实例在keyPressed 方法中进行了修改。但随着

    this.setContentPane(new Panneau());
    

    您正在向框架中添加Panneau 实例 - 此实例keyPressed 方法中修改。

    代码还有一些其他问题,但要达到预期效果所需的最小更改是将这一行更改为

    this.setContentPane(this.pan);
    

    为了清除面板的背景(即移除之前绘制的矩形),您还必须在paintComponent 方法的第一行调用super.paintComponent(g)

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

    【讨论】:

    • 只是一个问题,super.paint 会与我们之后要添加的导弹发生冲突吗?因为我看到这个命令清理了所有的窗口然后添加了正方形? Tahnks 无论如何它正在工作:)
    • 当您在调用super.paintComponent 之后 绘制导弹时,就没有问题了。请注意,您要绘制的所有内容都必须在paintComponent 方法中绘制(或在从paintComponent 调用并接收相同Graphics 对象的方法中)。 (因此,如果您打算在任何地方拨打getGraphics不要这样做)。另见docs.oracle.com/javase/tutorial/uiswing/painting
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 2021-07-17
    • 2014-06-11
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多