我有一個類Forest
和CellularJPanel
,它擴展了JPanel
並顯示Forest
。我寫了一個原始代碼來創建JFrame
,Forest
,CellularJPanel
並將CellularJPanel
添加到JFrame
。接下來是一個無限循環,它使Forest
更新和CellularJPanel
重繪。如果在JFrame代碼中調用repaint(),則JPanel不會重新繪製
JFrame jFrame = new JFrame();
Forest forest = new Forest();
CellularJPanel forestJPanel = new CellularJPanel(forest);
jFrame.add(forestJPanel);
jFrame.pack();
//jFrame.setResizable(false);
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
while (true)
{
try
{
forestJPanel.repaint();
forest.update();
forest.sleep(); // calls Thread.sleep(...)
}
catch (InterruptedException e)
{
}
}
這裏是CellularJPanel
類的代碼:
public class CellularJPanel extends JPanel
{
private CellularAutomata cellularAutomata;
public CellularJPanel(CellularAutomata cellularAutomata)
{
super();
this.cellularAutomata = cellularAutomata;
setPreferredSize(this.cellularAutomata.getDimension());
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D graphics2D = (Graphics2D)g;
cellularAutomata.draw(graphics2D);
}
}
如果我使用上面的代碼main()
方法中,則一切正常, CellularJPanel
重繪paintComponent()
通常被稱爲。
如果我相同的代碼粘貼到UI的JFrame按鈕單擊事件方法,那麼新JFrame的節目,甚至還可以顯示該Forest
的初始狀態,因爲paintComponent
被調用一次,當jFrame.setVisible(true)
被調用。然後while
循環正在執行,但CellularJPanel
不重畫,paintComponent
不稱爲。我不知道爲什麼,也許我應該使用SwingUtilities.invokeLater(...)
或java.awt.EventQueue.invokeLater
,但我已經嘗試過它,它不起作用,我做錯了什麼。
有什麼建議嗎?
P.S. 我的目標是在單擊按鈕的同一個UI JFrame中顯示CellularJPanel
。但即使我將此面板添加到主UI JFrame,它也不起作用。
順便說一句,歡迎來到StackOverflow! – Krease
謝謝:) StackOverflow是令人難以置信的有用! – Darko