有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java图像没有重新绘制,只是相乘

我有一个JPanel实现了一个密钥侦听器。它提取并显示从另一个类中提取的图像。NA将密钥侦听器传递给该类,以获取多个图像中的一个,并将其向一个方向移动2px。我的问题是,当我调用repaint()时,旧图像不会消失,所以我会得到一行图像。 问题是,当我将这个类与图片和JPanel类结合到一个双决赛中时,它工作得非常好
我对此做了一些研究,发现了双缓冲。如果我必须这样做,那么当合并成一个大类与单独的类时,它为什么会起作用呢? 这是我的JPanel类代码。有人能帮我吗?如果答案是双重缓冲,有人能给我解释一下吗。我懂理论,但不懂代码

import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.Image;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
  public class picPanel extends JPanel
  {
     walker w; 
     JPanel panel;

   public picPanel()
   {
     w=new walker();
     addKeyListener(new TAdapter());
     setFocusable(true);
     System.out.println(w.getX());
     System.out.println(w.getY());
     if(w.getImg()==null)
        System.out.println("is emty"); 

     repaint();
     //test();

    }

   public void paintComponent(Graphics g)
   {
    System.out.println("Hello");
    //Graphics2D g2d = (Graphics2D)g;

    Image m = w.getImg();
    g.drawImage(m,w.getX(),w.getY(),this);

   }

  private class TAdapter extends KeyAdapter 
  {  
   public void keyPressed(KeyEvent e) 
   {
     w.keyPressed(e);
     System.out.println("Hello");
     repaint();

   }
  }
 }

共 (1) 个答案

  1. # 1 楼答案

    只需在paintComponent方法中调用super.paintComponent

    关于你的代码的进一步评论

    1. Swing设计用于KeyBindings iso KeyListeners
    2. 为了便于他人阅读您的代码,请遵守Java naming/code conventions,例如,类以大写字母开头,变量以小写字母开头
    3. 重写方法时添加@Override标记是一个好习惯。编译器不仅会检查签名是否匹配,还可以让需要阅读代码的其他人更容易地快速查看您添加了哪些方法,以及您只是重写了哪些方法