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
}
我個人會避免使用Thread來執行動畫(除非你有一個特別複雜的模型,可能需要花費不同的時間來更新)並依賴於'javax.swing.Timer'改爲 – MadProgrammer 2013-05-10 00:43:08
同上@ MadProgrammer的建議。你的繪圖代碼中也不應該有任何程序邏輯,甚至像'd ++'這樣看起來無害的東西。您無法完全控制何時或如何進行繪圖。 – 2013-05-10 00:49:43
我沒有看到Java 7/Windows 7下的特定問題。在某些情況下,您可能會獲得更好的刷新,因爲所需更新區域較小,但我沒有看到它... – MadProgrammer 2013-05-10 00:51:28