Я нашел решение для моего предыдущего вопроса, который привел меня к новой проблеме.
В следующем коде я перемещаю изображение вокруг JFrame с помощью клавиш со стрелками. но каждый раз, когда я нажимаю клавишу со стрелкой, изображение кажется мерцающим, что весьма заметно, когда клавиша нажата непрерывно.
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class TestProgram extends JFrame implements KeyListener {
private BufferedImage TestImage;
private int cordX = 100;
private int cordY = 100;
public TestProgram() {
setTitle("Testing....");
setSize(500, 500);
imageLoader();
setVisible(true);
}
public void imageLoader() {
try {
String testPath = "test.png";
TestImage = ImageIO.read(getClass().getResourceAsStream(testPath));
} catch (IOException ex) {
ex.printStackTrace();
}
addKeyListener(this);
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(TestImage, cordX, cordY, this);
}
public static void main(String[] args) {
new TestProgram();
}
public void keyPressed(KeyEvent ke) {
switch (ke.getKeyCode()) {
case KeyEvent.VK_RIGHT: {
cordX+=5;
}
break;
case KeyEvent.VK_LEFT: {
cordX-=5;
}
break;
case KeyEvent.VK_DOWN: {
cordY+=5;
}
break;
case KeyEvent.VK_UP: {
cordY-=3;
}
break;
}
repaint();
}
public void keyTyped(KeyEvent ke) {}
public void keyReleased(KeyEvent ke) {}
}
Есть ли какое-нибудь решение, чтобы избежать этого?
РЕДАКТИРОВАТЬ: выше приведен полный рабочий код. Мне трудно включить в него двойной буфер. может ли кто-нибудь помочь мне в этой части?
JFrame
), вместо этого расширяйтеJPanel
3) Установите предпочтительный размер панели и вызовитеpack()
, а не задавайте размер фрейма 4) Для не TLC переопределитеpaintComponent()
, а неpaint()
5) Запустите и измените графический интерфейс на EDT. 6) Для приложений Swing рассмотрите возможность использования привязок клавиш вместоKeyListener
. 7) Во время развертывания вам, вероятно, потребуется получить доступ к изображению по URL-адресу. - person Andrew Thompson   schedule 03.06.2012