Привет, я получаю случайное мерцание каждые две секунды при запуске моей программы, у него есть одно изображение, движущееся по экрану. Я использую метод Graphics paint() и repaint() в методе run() потока. Вот соответствующие части кода, я буду публиковать весь код, если это необходимо. Btw, пешки - это arraylist, загруженный предметами пешки, изначально у меня было 5 потоков для 5 изображений, перемещающихся, но я пробовал только с одним изображением, и он все еще мерцает, так что это не так.Java - мерцание при использовании repaint()
private BufferedImage helicopter;
helicopter = ImageIO.read(new File("white.png"));
public void paint(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
for(count=0; count<pawns.size(); count++){
g.drawImage(helicopter, pawns.get(count).getX(), pawns.get(count).getY(), null);
}
g.setColor(Color.BLACK);
g.drawLine(350, 0, 350, 600);
}
public void run() {
while(true) {
randSleep = (int)(Math.random()*100);
randMove = (int)(Math.random()*2);
pawn.setX(pawn.getX()+randMove);
try{
Thread.sleep(40);
}
catch(Exception e) {
e.printStackTrace();
}
repaint();
}
}
Вы должны называть 'super.paint (g)' перед тем, как делать что-либо еще в методе 'paint'. Если ваш класс является подклассом 'JComponent', используйте его метод' paintComponent' вместо 'paint' и сделайте вызов' super.paintComponent (g) '. Кроме того, поскольку 'java.awt.Component' и его подклассы реализуют« ImageObserver », почему бы вам не заменить« null »ссылкой в вызове' drawImage'? – TNT
Возможно, вам понадобится двойная буферизация. –
Я не могу использовать paintComponent, потому что я использую jFrame, я мог бы создать jpanel, а затем использовать paintcomponent, и я мог бы попробовать это позже. С другой стороны, я реализовал doublebuffering, но он не работает, мерцание все еще существует. – user2627736