Java Canvas repaint()正在闪烁

所以我终于得到了一个Canvas以我想要的方式工作但它不断闪烁,repaint()每秒运行20次,当我每秒运行10次时轻弹就会减弱。

package pd.data; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JPanel; import pd.areas.MainMenu; @SuppressWarnings("serial") public class Main extends JFrame implements Runnable { private JPanel contentPane = new JPanel(); private Thread gameThread = new Thread(this); public boolean running = false; @SuppressWarnings("unused") private int current = PDU.PD_MAIN_MENU; private MainMenu mainmenu; public Main() {main.setTitle("PD"); main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); main.setLocation(SPU.screenWidth / 2 - SPU.windowSize.width / 2, SPU.screenHeight / 2 - SPU.windowSize.height / 2); main.setResizable(false); main.setVisible(true); contentPane.setLayout(new BorderLayout(0, 0)); contentPane.setPreferredSize(SPU.windowSize); main.setContentPane(contentPane); main.pack(); mainmenu = new MainMenu(); contentPane.add(mainmenu, BorderLayout.CENTER); this.gameThread.start(); } @Override public void run() { running = true; while (running) { { mainmenu.repaint(); } try { Thread.sleep(SPU.TSU); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { new Main(); } } 

以下是我的MainMenu类:

 package pd.areas; import java.awt.Canvas; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; @SuppressWarnings("serial") public class MainMenu extends Canvas{ BufferedImage img = null; public MainMenu() { this.setBackground(Color.BLACK); } public void paint(Graphics graphics){ try { img = ImageIO.read(this.getClass().getResource( "/image.png")); } catch (IOException e1) { e1.printStackTrace(); } graphics.drawImage(img, this.getWidth() / 2 - img.getWidth()/2, 50, null); } } 

虽然闪烁实际上是一个很好的效果,它会影响整个canvas而不仅仅是我猜的图像,我该如何修复闪烁?

  1. 不要使用java.awt.Canvas。 请改用JPanel。
  2. 在JPanel的paintComponent方法中绘制。
  3. 不要忘记调用你的super的绘画方法,对于paintComponent来说,这将是super.paintComponent(graphics)
  4. 切勿尝试从任何绘画方法中读取图像。 这将减慢绘画速度,使你的程序看起来没有反应。 为什么要一遍又一遍地读同一张图片呢? 一次读取并将其保存到变量中。