2016-06-01 2 views
0

Я сделал короткую анимацию Java, которая запускается в новом потоке. Анимация получается на холсте. Он освежает каждые 100 мс. На некоторых тиках прямоугольник не отображается. (На связанном видео вы можете его увидеть) Я попытался найти решения в Интернете, но из-за моего стандартного английского языка я не знал, как правильно это сделать Google.Части Java Animation dissappear

package com.felix.pack; 

import java.awt.Canvas; 
import java.awt.Dimension; 
import java.awt.Graphics; 

import javax.swing.JFrame; 

public class Draw extends Canvas implements Runnable { 

    Thread x; 
    int xpos = 0; 
    int ypos = 0; 
    JFrame window; 
    boolean runs = false; 
    Graphics g; 

    public Draw() { 
     doWindow(); 
     setPreferredSize(new Dimension(500,500)); 
     window.add(this); 
    } 

    @Override 
    public void run() { 

     g = getGraphics(); 
     while (runs) { 
      paint(g); 
      try { 
       Thread.sleep(100); 
       xpos +=1; 
       ypos +=1; 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       System.out.println("Fail"); 
       stop(); 
      } 
     } 

    } 

    private void doWindow(){ 
     window = new JFrame(); 
     window.setSize(500, 500); 
     window.setTitle("Hey"); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setVisible(true); 
    } 

    public void start() { 

     if (runs == false) { 
      runs = true; 
     x = new Thread(this); 
     x.start(); 

     } else { 
      System.out.println("Thread läuft bereits"); 
     } 
    } 

    public void stop() { 
     runs = false; 
     try { 
      x.join(); 
      System.out.println("Thread erfolgreich geschlossen"); 
     } catch(Exception e) { 
      System.out.println("Closing thread didnt work"); 
     } 
    } 

    public void paint(Graphics g){ 
     g.clearRect(0, 0, 500, 500); 
     g.fillRect(xpos, ypos, 400, 400); 
    } 

} 

В моем основном классе я начинаю запуск метода, который содержится в этом классе. Детали, которые вам нужно посмотреть (я думаю), - это метод run() и метод рисования. Остальные - это просто помощь, чтобы поток начал и остановился безопасно.

https://www.youtube.com/watch?v=pAFng8mOcOQ

Вот видео. Я надеюсь, что вы, ребята, можете помочь мне, и им жаль, если это глупый вопрос :)

ответ

0

На некоторых клещей прямоугольник не показывает вверх

я скачал и побежал ваш код, но я не вижу мерцание, которое вы описываете, поэтому это может быть системное ограничение на вашем конце. Этот пост, кажется, касается проблем, которые вы видите, хотя и с еще более быстрыми темпами живописи: Stop flickering in swing when i repaint too much

Что касается темного темно-серого, что вы видите на видео, это из-за вашего метода paint(). Обратите внимание, что вы всегда вызываете только g.clearRect(0, 0, 500, 500), хотя размер вашего окна меняется. Вместо этого попробуйте g.clearRect(0, 0, window.getWidth(), window.getHeight()), так что при изменении размера окна также будет область, которую вы очищаете.