2015-06-25 34 views
0

我想繪製一個矩形,其位置每秒更新一次,因爲我有一個擴展JPanel的類,並且在其中我重寫了paint(或paintComponent)function_我已經試過_但在器件上,這個函數只被調用一次,如下面代碼所示,當我試圖用無限循環調用它時,它不會被調用,任何想法我可以做什麼?重繪在java中不工作

public class Board extends JPanel implements KeyListener{ 
public void setUpBoard(){ 
    JFrame frame = new JFrame(); 
    Board board = new Board(); 
    frame.setVisible(true); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(600, 600); 
    frame.setLocation(350, 80); 
    frame.add(board); 
    } 
public void paint(Graphics g){ 
    g.setColor(Color.RED); 
    g.fillRect(food.getX(),200,20,20); 
     } 
} 

上述代碼圖形的一部分,下面是主要的功能,它被放置在另一個類:

public static void main(String[] args) throws InterruptedException { 
    Board board = new Board(); 
    FoodGenerator food = new FoodGenerator(); 
    board.setUpBoard(); 
    while(true){ 
     board.repaint(); 
     food.adder(); 
     try { 
      sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 


} 

在上述food.adder代碼,其中矩形的位置是更新,我已檢查並沒有任何問題。

+0

你是否正在修改重新調用之間的任何內容?我會檢查你的主食中的食物是否與你的烤漆方法中的食物相同。 – bakalolo

+1

不要重寫'paint',使用'paintComponent';不要打破繪畫鏈,確保你正在調用'super.paintComponent';看看[在AWT和Swing中繪畫](http://www.oracle.com/technetwork/java/painting-140037.html)和[執行自定義繪畫](http://docs.oracle.com/javase/tutorial/uiswing/painting /)以更好地理解繪畫的工作原理。此外,請查看[使用JFC/Swing創建GUI](http://docs.oracle.com/javase/tutorial/uiswing/),以更好地瞭解Swing GUI的工作方式 – MadProgrammer

+0

您可能還想看看[併發中的Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/),爲了簡單起見,[如何使用Swing定時器](http://docs.oracle.com/ javase/tutorial/uiswing/misc/timer.html) – MadProgrammer

回答

2

的問題是,你在setUpBoard創建一個新Board對象,並添加您的JFrame:

Board board = new Board(); 
// ... 
frame.add(board); 

所以當你使用repaint(),你重繪的Board實例,你在main方法中創建,而不是您在setUpBoard中創建的實例,該實例是您添加到框架中的實例。

這可以很容易地通過使用Board board = this;setUpBoard,或者,更簡單地在我看來,只是使用frame.add(this)。隨後對repaint的調用將安排調用paint作爲您在主方法中創建的同一個Board對象。

此外,由於您正在使用Swing,因此請勿使用paint,而應使用paintComponent,確保super.paintComponent(g)是方法主體中的第一條語句。

+1

恕我直言,Board不應該創建框架,但它不會影響您的答案 – MadProgrammer

0

另一個問題是repaint調用正在主線程上完成,而不是在事件線程上完成。