我想出了我的previous question解決方案,使我陷入了新的問題。重繪圖像閃爍()
在下面的代碼中,即時通過使用箭頭鍵移動一個圖像周圍的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) {}
}
有沒有解決方案可以避免這種情況?
編輯:上面是完整的工作代碼。我發現很難將doublebuffer加入其中。任何人都可以幫助我嗎?
1)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 2)不要延長框架。 3)不要在頂層容器中繪製(比如'JFrame')而是擴展一個'JPanel' 3)設置面板的首選大小並調用'pack()'而不是設置幀的大小4)對於一個非TLC,覆蓋'paintComponent()'而不是'paint()'5)啓動並修改EDT上的GUI。 6)對於Swing應用程序,考慮使用鍵綁定而不是「KeyListener」。 7)部署時,您可能需要通過URL訪問圖像。 –
@Andrew Thompson嗯,你回答了這個問題 – mKorbel
@mKorbel我提供了一些提示。 (聳聳肩) –