2013-05-29 59 views
1

我一直在玩Java的2D繪畫工具,並遇到了一個障礙。我正在嘗試移動這些對象。下面是代碼:Java繪製的對象沒有正確更新

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Test extends JPanel{ 

private int[] location = new int[2]; 

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

g.setColor(Color.red); 
g.fillArc(location[0], location[1], 100, 100, 45, 90); 
g.setColor(Color.black); 
g.fillArc((location[0]+50-10),(location[1]+50-10), 20, 20, 0, 360); 

new Timer(2000, new ActionListener() { 
@Override 
public void actionPerformed(ActionEvent e) { 
setLocation((location[0]+50),50); 
repaint(); 
System.out.println("repainting"); 
     } 
}).start(); 

} 

public void setLocation(int x, int y){ 
this.location[0] = x; 
this.location[1] = y; 
} 


public static void main(String[] args){ 
JFrame jf=new JFrame(); 
jf.setDefaultCloseOperation 
(JFrame.EXIT_ON_CLOSE); 
jf.setPreferredSize(new Dimension(300,500)); 
jf.setLocation(100,100); 
jf.add(new Test()); 

jf.pack(); 
jf.setVisible(true); 

} 
} 

這僅塗料兩個對象在屏幕中的一個......它似乎是第二個當我改變setLocation的[1]所述一個物體上的參數它作爲油漆移動。有什麼想法嗎?謝謝

編輯:編輯上面的代碼,以反映下面說的。

回答

2

您正在以默認方式將兩個組件添加到JFrame中。這將添加組件BorderLayout.CENTER,因此第二個組件將覆蓋並遮蓋第一個組件。您需要閱讀佈局經理來解決這個問題。同時在Swing Timers上閱讀簡單的動畫,因爲即使正確寫入代碼,也不會執行動畫。

如果要移動圖形,然後

  • 僅使用一個測試的JPanel
  • 覆蓋JPanel的paintComponent(...)方法,而不是paint(...)方法。
  • 調用super.paintComponent(g)方法首先在paintComponent方法中覆蓋。
  • 給測試JPanel公共方法允許外部類更改位置而不讓它們直接與字段對齊。使位置字段(名稱應以小寫字母開頭)專用以保證安全。
  • 使用擺動計時器定期調用此方法並更改位置,然後在JPanel上調用repaint()
+0

是的,它並不打算按原樣移動。我只是在設置自己的位置並試圖旋轉它們。不過,我一定會用你提供的名單幫助我實現這個目標。謝謝 ! –

+0

有一件事 - 我所有的方法都是公開的......我在這裏錯過了什麼? –

+0

@PeterF:是的,你的Location字段(應該重新命名爲「location」,小寫字母「l」)應該是** private **,不公開。但是你的'setLocation(...)'方法看起來不錯。 –