2013-09-12 6 views
2

Я новичок в программировании AWT/Swing. Я пытаюсь сделать изображение 100 000 раз. Цикл метода drawImage() находится в методе paint(). Я нахожу времена, когда java вызывает метод paint(), довольно неустойчивый. Он может вызывать метод paint() два раза за одно время работы программы, но другие могут звонить три раза. Если я создаю кнопку, которая делает repaint(), она будет звонить только paint() один раз, когда я нажимаю эту кнопку.Как работает JVM в Swing?

Может ли кто-нибудь сказать мне, когда будет вызван метод paint()? Я знаю, что сгенерированная системой картина и анимация, созданная приложением. Но я думаю, что это не относится ни к одному из этих случаев.

+0

'Я знаю, что сгенерированная системой картина и приложение, созданное с помощью приложения. Но я думаю, что это не относится ни к одному из этих случаев. - Какой другой случай был бы? – camickr

+1

На этом уровне Swing является самодостаточным, и JVM ничего не говорит. Тем не менее, вам нужно называть 'repaint' каждый раз, когда вы думаете, что ваша панель должна быть нарисована. – zneak

+0

Swing использует процесс пассивной краски, то есть краска времени называется случайной и основана на решениях, которые делает RepaintManager. Если вы хотите контролировать, когда вызывается краска, вам нужно будет использовать активный подход к рисованию. Сказав, что если изображения каким-то образом меняются, я бы предоставил буфер резервного копирования/I age во-первых и просто нарисую его в графическом контексте, когда вызывается краска. Возможно, вам понравится прочитать [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) для более детального изучения процесса рисования. – MadProgrammer

ответ

0

Вы можете использовать другой поток, чтобы позвонить repaint() metho. Легкий способ сделать это - сделать ваш класс рисования (java.awt.Canvas или как здесь javax.swing.JPanel) реализовать Runnable и запустить этот Thread в конструкторе. Также добавьте метод run().

import javax.swing.*; 

public class DrawPicktures extends JPanel implements Runnable 
{ 
    public DrawPickture() 
    { 
     /* Code */ 
     new Thread(this).start(); 
    } 

    public void Paint(Graphics g) 
    { 
     super.Paint(g); // Will draw all gui components added 
     /* Code */ 
    } 

    public void run() 
    { 
     while(true) 
     { 
      repaint(); 
      try 
      { 
       Thread.sleep(1000 /* Waits for 1000 milliseconds */); 
      } 
      catch(InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Поскольку JPanel (или Canvas) будет перекрашен из другого потока не будет блокировать ваш основной поток так что ваша программа может делать другие вещи, в то же время.

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