2013-06-28 55 views
1

我創建了一個測試版本,以簡化我在爲你們的問題:當啓動該程序油漆(圖形G)防止組件被吸入

import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Test extends JFrame { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    JLabel l = new JLabel("hello"); 
    JPanel cp; 

    public Test(){ 
     setContentPane(cp = new JPanel()); 
     cp.add(l); 
     setSize(200, 200); 
     setVisible(true); 
    } 

    public void paint(Graphics g){ 
     //do absolutely nothing 
    } 
} 

,你能看到一個完美的空白窗口。但是,如果您刪除繪畫方法,JLabel將顯示! (真的,我不得不搜索這個bug了)。現在,我該如何啓用一個窗口來同時使用圖形和定期繪製組件? 在此先感謝

+1

你不應該覆蓋的頂層窗口的'漆(...)'方法,因爲它很少是必要的,往往是有害的。請參閱戴夫的更多答案。 –

回答

7

1)您不應該覆蓋paint(..)JFrame,除非您有特定的目的。

在擺動拉絲的正確方法是:

  • 添加JPanelJFrame
  • JPanel,覆蓋paintComponent(..)getPreferredSize()返回正確Dimension S的適合我們的圖紙。 NB不要忘記調用super.paintComponent(g)作爲第一個呼叫中重寫paintComponent方法兌現油漆鏈

this回答我的其中有幾個例子給你。

  • 也不要延長JFrame不必要的。在JFrame
  • 不要調用setSize而是使用正確的LayoutManager和/或覆蓋getPreferredSize() - 通常在JPanel完成後,我們直接繪製或JPanel不會有任何的大小,如果沒有添加成分,如果他們也只會是作爲大,因爲它需要適合組件而不是圖像。
  • 並且在JFrame之前調用pack(),然後將其設置爲可見。

而只是櫃面看看Concurrency in Swing尤其是Event-Dispatch-Thread