2012-08-14 51 views
4

我使用JFrame創建並顯示了一個窗口,它已將其設置爲非常基本的屬性。Windows重疊時擦除JFrame的內容

public FrameVertices(String sTitle, Graph mMap, int iMul) { 
    super(sTitle); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize (300, 300); 
    setLocation (600, 300); 
    setVisible (true); 

    this.iMul = iMul; 
    this.gGraph = mMap; 
} 

然後我用油漆塗料()方法的窗口裏面的東西。

問題是,當其他一些窗口覆蓋我的JFrame然後發現它時,JFrame的內容沒有重新繪製 - 除非我調整大小或最小/最大值JFrame

我錯過了什麼嗎?

+2

你錯過了更多的代碼,可能會告訴我們你的錯誤在哪裏。考慮創建一個*小*可編譯和可運行的程序,我們可以運行,這將向我們證明你的問題。另外,你幾乎不應該直接在頂層Swing窗口中繪製,而應該繪製JComponent的paintComponent方法,比如JPanel。 – 2012-08-14 17:23:00

+3

請同時顯示'paint()'方法代碼或HFOE表示創建[sscce](http://www.sscce.org) – 2012-08-14 17:24:14

回答

7

直接塗刷到JFrame並不是一個好習慣。更好的方法是覆蓋在JPanelpaintComponent()並添加JPanelJFrame

Test.java:

public class Test extends JFrame { 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
      new Test().createUI(); 
      } 
     }); 

    } 

    void createUI() { 

      setSize(500,500); 
      getContentPane().add(new MyPanel()); 
      setVisible(true);  
     } 
} 

MyPanel.java:

class MyPanel extends JPanel { 

    @override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     //paint what you want here 
     g.drawString("Hello world",250,250); 
    } 
} 

但是,如果你一定要,我建議在JFrame實例中添加一個窗口FocusListener並呼叫repaint(),當它將其帶入焦點時:http://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html

通過方法windowGainedFocus(WindowEvent e)windowStateChanged(WindowEvent e)windowActivated(WindowEvent e)調用repaint()其中的1個方法將調用paint()方法。

+2

使用paintComponent繪製JPanel是解決方案。看起來,當您調整窗口大小或最小/最大值時,JFrame上的paint()會被執行 - 而不是當其他窗口覆蓋它並刪除內容時。反過來 - paintComponent被觸發並重新繪製內容。 – 2012-08-14 17:53:24

+2

@ Protechnologia.pl:不僅如此,當您這樣做時,您將獲得Swing雙緩衝的優勢。 1+。 – 2012-08-14 17:56:19

+1

我注意到您的第一個片段中有一小段錯誤。你可以從靜態方法Main調用一個非靜態方法(準確地說 - 從靜態方法Main中的內部類)。如果我是對的 - 在Main中,你應該首先創建一個Test類的實例,然後你就可以調用它的方法。 – 2012-08-14 21:13:48

1

如前面的答案建議由大衛,這不是去左右搖擺的東西的好方法,但如果你有,或以某種方式想這樣做,ü可能想使用WindowListener接口(或WindowAdapter類,如果你想簡化重寫方法的任務),並使用windowActivatedwindowDeactivated函數以某種方式調用repaint()方法。 這裏的文檔:WindowListener#windowDeactivated

編輯:
從給定的代碼示例,似乎你已經擴展了JFrame類,所以你唯一的選擇是貫徹落實WindowListener接口。

+0

不,最好的選擇不是擴展JFrame,也不是在JFrame中繪製directl。 – 2012-08-14 17:55:39

+0

是的,你是完全正確的,而且我只是指出了一條出路,以防某些人強調解決這個問題。 – SpiXel 2012-08-14 18:01:00