2013-05-10 96 views
1

我在繪製JComponent時遇到了這種奇怪的毛刺。 發生什麼事是,只要我拖動JFrame窗口超出我的顯示器的邊界,繪圖加速和繪製得比它應該更快。我猜測它必須在擺動管理方面做些事情,好像在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 2013-05-10 00:43:08

+1

同上@ MadProgrammer的建議。你的繪圖代碼中也不應該有任何程序邏輯,甚至像'd ++'這樣看起來無害的東西。您無法完全控制何時或如何進行繪圖。 – 2013-05-10 00:49:43

+0

我沒有看到Java 7/Windows 7下的特定問題。在某些情況下,您可能會獲得更好的刷新,因爲所需更新區域較小,但我沒有看到它... – MadProgrammer 2013-05-10 00:51:28

回答

2
  • 還沒有程序邏輯在你的繪畫方法。
  • 使用浮點數double來做縮放,而不是int,如d。
  • 根據縮放編號在系統時間的值,而不是代碼中包含的邏輯,您無法控制調用的速度,繪製方法。