如何重新运行paint方法以使JPanel动画化?

我想我需要在注释所在的位置放一些代码(或者使用非静态方法,但我不确定)。 main方法创建窗口,然后启动图形方法。 我希望蓝色方块能够闪现。

import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class paintTest extends JPanel{ private static JFrame theWindow = new JFrame("Window"); static boolean blueSqr = false; public void paint(Graphics g) { g.setColor(Color.RED); g.fillRect(10, 10, 10, 10); if(blueSqr){ g.setColor(Color.BLUE); g.fillRect(10, 10, 10, 10); } } public static void main(String[] args){ createWindow(); theWindow.getContentPane().add(new paintTest()); while(true){ blueSqr = false; System.out.println("off"); try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} blueSqr = true; // Needs something here System.out.println("on"); try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} } } public static void createWindow(){ theWindow.setSize(500, 500); theWindow.setLocationRelativeTo(null); theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); theWindow.setVisible(true); } } 

任何帮助都会非常好。

使用Swing Timer调用repaint() 。 另外,在JPanel覆盖paintComponent() ,而不是paint()

像这样的东西:

 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PaintTest extends JPanel{ boolean blueSqr = false; PaintTest() { setPreferredSize(new Dimension(100,25)); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent ae) { blueSqr = !blueSqr; repaint(); } }; Timer timer = new Timer(1000,al); timer.start(); } public void paintComponent(Graphics g) { Color c = (blueSqr ? Color.BLUE : Color.RED); g.setColor(c); g.fillRect(10, 10, 10, 10); } public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame theWindow = new JFrame("Window"); theWindow.getContentPane().add(new PaintTest()); createWindow(theWindow); } }); } public static void createWindow(JFrame theWindow){ theWindow.pack(); theWindow.setLocationByPlatform(true); theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); theWindow.setVisible(true); } } 

还有其他一些改进我无法记录(代码比单词更响亮)。 如果您有任何问题(请先查看文档)然后询问。

你的问题是

1)通过在Swing相关代码中调用Thread.sleep(int) ,永远不要这样做,以便在Swing中延迟(有很多关于为什么不在编程语言中使用sleep的主题……)使用Swing Timer

2)你的JPanel不会返回任何XxxSize

3)对于Swing使用paintComponent() ,只有当你有非常重要的原因然后使用方法paint()更多关于重绘和动画2D图形教程中的图形

4)Swing GUI应该在Event Dispatch Thread中构建