4
這是我第一次嘗試使用BufferStrategy
,我真的很感激一些提示。爲什麼getSize()不適合我在這裏,爲什麼調整大小時閃爍?
1)爲什麼在下面的代碼中,getSize()
返回的維數爲0,直到您調整窗口大小?我該如何檢測窗口的大小?
2)爲什麼當getSize()
返回時,它不是窗口的全部尺寸? IE爲什麼在底部和右側會出現一條黑色條紋?
3)調整窗口大小時,有沒有辦法擺脫閃爍?
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BSTest extends JFrame {
BufferStrategy bs;
DrawPanel panel = new DrawPanel();
public BSTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800,420);
setLocationRelativeTo(null);
setIgnoreRepaint(true);
setVisible(true);
createBufferStrategy(2);
bs = getBufferStrategy();
panel.setIgnoreRepaint(true);
add(panel);
panel.drawStuff();
}
public class DrawPanel extends JPanel {
public void drawStuff() {
while(true) {
try {
Graphics2D g = (Graphics2D)bs.getDrawGraphics();
g.setColor(Color.BLACK);
System.out.println("W:"+getSize().width+", H:"+getSize().height);
g.fillRect(0,0,getSize().width,getSize().height);
bs.show();
g.dispose();
Thread.sleep(20);
} catch (Exception e) { System.exit(0); }
}
}
}
public static void main(String[] args) {
BSTest bst = new BSTest();
}
}
哇,夥計,這個例子解決了我所有的問題,謝謝!一個問題:這個方法是否像使用'BufferStrategy'方法一樣資源友好,在哪裏繪製內容然後執行bs.show()?我的意思是,它是否讓顯卡完成所有艱苦的工作? – 2012-02-25 06:58:23
好問題:它採用主機平臺盡力而爲的稍微更高的抽象級別運行。請注意,所有'JComponent'子類都繼承了'Component'的緩衝策略。 – trashgod 2012-02-25 07:20:42
@flea whale我還有一些最重要的問題,1)bs.getDrawGraphics();只是快照,每個繪畫都被代碼行Thread.sleep(int)所殺;使用Swing Timer代替+1 – mKorbel 2012-02-25 08:16:37