2010-03-10 20 views
1

我不習慣GUI開發,但現在我需要它一點,我想避免閱讀所有文檔,只是因爲這個問題。自定義組件擺在鞦韆上的問題

我無法顯示像我在下面發佈的自定義組件。如果我將它添加到JFrame中,它可以正常工作,但我不能再添加一個,如果將它添加到JPanel中,它將不會顯示。

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JComponent; 

public class Test extends JComponent implements Runnable { 

    private int c,x,y; 

    public Test(int x,int y){ 
     c = 0; 
     this.x = x; 
     this.y = y; 
    } 

    private void inc(){ 
     c++; 
     if(c>255){ 
      c = 0; 
     } 
    } 

    public void paint(Graphics g) { 
     g.setColor(new Color(c,c,c)); 
     g.fillRect(x, y, 50, 50); 
    } 

    public void run() { 
     while(true){ 
      inc(); 
      try{ 
       Thread.currentThread().sleep(20); 
      } catch (Exception e){ 
      } 
      repaint(); 
     } 
    } 
} 

回答

2

我想避免全部讀取 文檔,只是因爲這個 問題。

是的,很好的閱讀實際上可以節省時間,因爲你第一次正確做事,你不必坐在等待/希望有人回答你的問題。

所以先從Swing tutorial

1)自畫是通過重寫的paintComponent()方法實現的。閱讀「自定義繪畫」的Swing教程部分。

2)動畫應該使用Swing Timer完成,參見教程中「如何使用計時器」一節。

3)其實你不需要創建一個自定義組件。所有你需要做的就是創建一個JPanel,設置它的首選大小,然後使用一個Timer來改變它的背景。

+0

JComponent和JPanel之間的唯一區別是後者描繪了它的背景......所以它並不重要,擴展如下:-) – Vanya 2010-03-10 17:34:35

1

作爲最低限度,你應該也有必要對setPreferredSize(X + 50,Y + 50)和setMininumSize(X + 50,Y + 50)在構造函數中,讓佈局管理器瞭解您的組件的尺寸放置它在容器小部件中正確。

另外,從AWTEventThread中調用repaint()是非常糟糕的。爲此使用SwingUtilities.invokeLater()。