2012-02-25 35 views
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(); 
    } 
} 

回答

5
  1. 一個JPanel的大小是無效的,直到validate()被調用,通常作爲結果的含Window調用pack()

  2. 最終尺寸是由多種因素組合而成的結果,包括封閉組件的首選尺寸以及針對特定外觀的面板UI代表的感覺。

  3. JPanel默認爲雙緩衝;不需要進一步的努力。 AnimationTest就是一個例子。

+0

哇,夥計,這個例子解決了我所有的問題,謝謝!一個問題:這個方法是否像使用'BufferStrategy'方法一樣資源友好,在哪裏繪製內容然後執行bs.show()?我的意思是,它是否讓顯卡完成所有艱苦的工作? – 2012-02-25 06:58:23

+0

好問題:它採用主機平臺盡力而爲的稍微更高的抽象級別運行。請注意,所有'JComponent'子類都繼承了'Component'的緩衝策略。 – trashgod 2012-02-25 07:20:42

+2

@flea whale我還有一些最重要的問題,1)bs.getDrawGraphics();只是快照,每個繪畫都被代碼行Thread.sleep(int)所殺;使用Swing Timer代替+1 – mKorbel 2012-02-25 08:16:37