2013-05-10 3 views
1

У меня такой странный вид сбоя с рисунком на JComponent. Случается, что всякий раз, когда я перетаскиваю окно JFrame за пределы моего монитора, рисунок ускоряется и рисуется быстрее, чем нужно. Я предполагаю, что он должен что-то сделать с управлением swing, кажется, что рисование останавливается, когда Jframe выключен и возобновляется в виде пакета, после того, как он установлен в пределах экрана монитора.Рисунок сложения на JComponent

Вот мой код:

package javagame; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import javax.swing.JComponent; 

/** 
* 
* 
*/ 
public class Screen extends JComponent implements Runnable{ 

// paintbrush for drawing. 
//private Graphics internalg; 
private boolean keepDrawing = true; 
public Screen() {   
    super(); 
    startDrawing(); 
} 

/// Draw methods 
@Override 
protected void paintComponent(Graphics g) {   
    super.paintComponent(g); 
    //internalg = g; 
    //Draw 
    //System.out.println("painted"); 
    drawSomething(g); 
} 

@Override 
public void run() { 
    //Draw until manually stopped 
    while(keepDrawing){ 
     repaint(); 
    try { Thread.sleep(100); } 
    catch (InterruptedException ex) { } 
    } 
} 
/** 
* Fire off thread. 
*/ 
private void startDrawing() 
{ 
    Thread t = new Thread(this); 
    //thread ends when JFrame is closed. 
    t.setDaemon(true); 
    t.start(); 

} 
/// Draw Logic /// 


/// Images 
int d = 2; 
public void drawSomething(Graphics internalg) 
{ 
    if (isValid()){ 
     internalg.setColor(Color.BLACK); 
     internalg.fillRect(0, 0, getWidth(), getHeight());//clear bg 
     internalg.setFont(new Font(Font.DIALOG, Font.BOLD, 15)); 
     internalg.setColor(Color.GREEN); 
     internalg.drawOval((getWidth()/2)-(d/2) , (getHeight()/2)-(d/25), d, d); 
     d++; 
    } 
} 

/// Images 

} 
+2

Я лично избегал использования 'Thread' для выполнения анимации (если у вас нет особенно сложной модели, которая может потребовать переменное количество времени для обновления) и полагаться на 'javax.swing.Timer' вместо – MadProgrammer

+1

То же на @ MadProgrammer совета. Кроме того, в коде чертежа не должно быть никакой логики программы, даже что-то вроде безобидного, как 'd ++'. У вас нет полного контроля над тем, когда или когда будет проведен рисунок. –

+0

Я не вижу вашей конкретной проблемы в Java 7/Windows 7. Возможно, вы можете получить лучшее обновление при некоторых обстоятельствах, поскольку требуемая область для обновления меньше, но я не вижу ее ... – MadProgrammer

ответ

2
  • Не имеет логику программы в своих методах окраски.
  • Используйте числа с плавающей точкой, двойные, чтобы сделать масштабирование, а не int, например d.
  • Укажите значение вашего масштабирующего номера в системном времени, а не на логике, содержащейся в коде, у вас нет контроля над тем, как быстро он называется, методами рисования.
Смежные вопросы