2015-04-01 63 views
1

我有一個類,通過定時器重畫它來創建動畫對象(蠕蟲狀動畫)。 另一類有我的框架和麪板。 當我創建此對象的2(mov和mov2)實例並將其添加到面板時,它們將顯示在分離面板中(或者看起來像)。繼承人的代碼。Java:在同一個JPanel上添加2個動畫對象(paintComponent)

public class Movimento extends JComponent{ 
    int t; 
    int a; 
    int[][] matriz; 

    public Movimento(int tamanho, int area){   
     t = tamanho; 
     a = area; 

     gerarMatriz(); 
     gerarPanel(); 

     ActionListener counter = new ActionListener() { 
      public void actionPerformed(ActionEvent ev){ 
       movimentarMatriz(); 
       repaint(); 
      } 
     };   
     new Timer(1, counter).start(); 
    } 

    public void gerarPanel(){ 
     this.setPreferredSize(new Dimension(a, a)); 
    } 

    public void gerarMatriz(){ 
     /* 
     *Generates an array[][] with initial coordinates 
     */ 
    } 

    public void movimentarMatriz(){ 
     /* 
     * add a new coordinate to the last space of the array 
     */ 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     for(int i = 0; i < matriz.length; i++){ 
      g.drawRect(matriz[i][0],matriz[i][1],1,1); 
     } 
    } 

然後我在這裏創建新對象MOVIMENTO

public class GeraImg{ 
    JFrame frame = new JFrame("Gera Imagem"); 
    JPanel panel = new JPanel(); 

    Movimento mov = new Movimento(1000,400); 
    Movimento mov2 = new Movimento(100,400); 

    public GeraImg(){ 
     fazerFrame(); 
    } 

    public void fazerFrame(){ 

     panel.setOpaque(true); 
     panel.setBackground(new Color(150,200,20,255)); 
     panel.add(mov2); 
     panel.add(mov); 

     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public static void main(String[] args){ 
     new GeraImg();  
    } 
} 

然後我並排得到2 separeted動畫面板側,同樣的面板內沒有2蠕蟲。

這個概念是完全錯誤的嗎? 感謝

回答

2
panel.add(mov2); 
panel.add(mov); 

默認情況下,一個JPanel使用FlowLayout中,所以是你的兩個組成部分區域由側方加入。

您可以嘗試使用:

panel.setLayout(null); 
panel.add(mov2); 
panel.add(mov); 

這將允許組件被隨機放置在面板內。但是現在你負責在你的組件上使用setSize(...)和setLocation(...),以便組件可以在面板中正確繪製。

但是,更好的方法是創建自己的類來實現自己的繪畫方法。例如:

public class Movimento() 
{ 
    ... 

    public void paintMe(Graphics g) 
    { 
     for(int i = 0; i < matriz.length; i++) 
     { 
      g.drawRect(matriz[i][0],matriz[i][1],1,1); 
     } 
    } 
} 

然後,您將創建組件來繪製所有Movimento對象。例如:

public class MovimentoAnimator extends JPanel 
{ 
    private List<Movimento> movimentos = new ArrayList<Movimento>(); 

    public void addMovimento(Movimento movimento) 
    { 
     movimentos.add(movimento); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     for (Movimento movimento: movimentos 
     { 
      movimento.paintMe(g); 
     } 
    } 
} 

該課程還將負責動畫。

+0

它像一個魅力工作。我將佈局設置爲空,並設置每個組件的位置和大小,它們在相同的空間中進行動畫處理。 我將研究創建一個分離類來動畫這些組件。謝謝!! – MVAmorim 2015-04-01 16:33:35

相關問題