2015-03-11 8 views
0

Я пытаюсь сделать изображение перемещаться случайным образом, но он почему-то не работает. Изображение появляется на панели, но оно не перемещается. Для этого я использую классы буксировки: основной класс и подкласс. Это код для моего подкласса.Попытка сделать изображение перемещается случайным образом, но оно не движется

public Image() 
{ 

    randomPosition(); 

    try { 
    image = ImageIO.read(new File("image.png")); 

    } catch (IOException e) {} 


} 


public void paint(Graphics g) 
{ 
    g.drawImage(image, x, y, this); 
    Toolkit.getDefaultToolkit().sync(); 
    g.dispose();  
} 



public void move() 
{ 


    x += dx; 
    y += dy; 


    if (x >= 550) { 
     x = 550; 
     randomDirection(); 
     } 
     if (x <= 1) { 
     x = 1; 
     randomDirection(); 
     } 
     if (y >= 350) { 
     y = 350; 
     randomDirection(); 
     } 
     if (y <= 1) { 
     y = 1; 
     randomDirection(); 
     } 
} 

public void randomDirection() { 
    double speed = 2.0; 
    double direction = Math.random()*2*Math.PI; 
    dx = (int) (speed * Math.cos(direction)); 
    dy = (int) (speed * Math.sin(direction)); 
    } 


public void randomPosition() 
{ 
    x = LEFT_WALL + (int) (Math.random() * (RIGHT_WALL - LEFT_WALL)); 
    y = UP_WALL + (int) (Math.random() * (DOWN_WALL - UP_WALL)); 
} 

public void run() 
{ 

    long beforeTime, timeDiff, sleep; 
    beforeTime = System.currentTimeMillis(); 
    while (true) 
    { 
     move(); 
     repaint(); 

     timeDiff = System.currentTimeMillis() - beforeTime; 
     sleep = DELAY - timeDiff; 

     if (sleep > 2) 
     { 
      sleep = 1; 
     } 
     try 
     { 
      Thread.sleep(sleep); 
     } 
     catch (InterruptedException e) 
     { 
      System.out.println("interrupted"); 
     } 

     beforeTime = System.currentTimeMillis(); 
    } 
} 

и это мой главный класс, где я начинаю тему:

public void addImage(){ 
      Image I = new Image(); 
      x = panel.getGraphics(); 
      I.paint(x); 
      Thread thr=new Thread(I); 
      thr.start(); 
     } 
+2

Не вызывайте 'getGraphics()'. Это не сработает и будет отменено после того, как менеджер по перекраске решает раскрасить. Вместо этого используйте 'paintComponent (Graphics)' и обязательно вызовите super! – Obicere

+0

Имена переменных не должны начинаться с символа верхнего регистра. Кроме того, имена переменных должны иметь смысл. Почему вы используете «I», это не соответствует ни одному из приведенных выше рекомендаций. – camickr

ответ

1
  • paint() должен быть

Как это:

  • Не звоните непосредственно paint()/paintComponent(). Вместо этого вызовите repaint(), это добавит его в очередь событий. Графический объект передается качели.

  • Я не уверен, что g.dispose() необходим и может вызвать проблемы.

  • Проверьте панель ваша картина в это размер правильно - быстрый способ отладки это panel.setBorder(BorderFactory.createLineBorder(Color.RED));
  • Рассмотрите возможность использования javax.swing.Timer вместо ниток. Это не является причиной проблемы, но будет более чистым.
+0

Я попробовал то, что вы мне сказали, и я исправил свой код следующим образом: public void paintComponent (Graphics g) { super.paintComponent (g); \t \t g.drawImage (изображение, x, y, this); Toolkit.getDefaultToolkit(). Sync(); } и это: Изображение i = новое изображение(); \t i.repaint(); \t Тема 3 = новая тема (i); \t thr.start(); \t} все еще не работает tho. –

+0

Можете ли вы упростить самодостаточный пример? Возможная проблема существует в другом месте вашего подкласса JPanel или конструкции JFrame. Сон для меня сейчас, поэтому не буду смотреть на это до завтра. – Adam

Смежные вопросы