我是Java Swing编程的新手。我要制作一个框架,该框架将依次出现红色和蓝色。因此,我带了两个孩子JPanel,一个带红色,另一个带蓝色,一个for循环。在每次迭代中,我从父面板中删除一个面板,然后添加另一个面板。但是,当我运行程序时,它仅显示帧的最后状态。
谁能解释为什么?那么使程序像这样工作的预期方法是什么?我的代码:
public class Test2 extends JFrame { public Test2() { JPanel Red = new JPanel(new BorderLayout()); JPanel Blue = new JPanel(new BorderLayout()); //...initialize Red and Blue Red.setBackground(Color.red); Blue.setBackground(Color.blue); Red.setPreferredSize(new Dimension(200,200)); Blue.setPreferredSize(new Dimension(200,200)); JPanel panel = new JPanel(new BorderLayout()); panel.setPreferredSize(new Dimension(200,200)); add(panel); pack(); setTitle("Border Example"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); int M = 1000000; //note that, I made a long iteration to not finish the program fast and visualize the effect for(int i=0;i<M;i++) { if(i%(M/10)==0) System.out.println(i); //to detect whether the program is running if(i%2==0) { panel.removeAll(); panel.repaint(); panel.revalidate(); panel.add(Red,BorderLayout.CENTER); } else { panel.removeAll(); panel.repaint(); panel.revalidate(); panel.add(Blue,BorderLayout.CENTER); } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Test2 ex = new Test2(); ex.setVisible(true); } }); }}
不要使用循环。只有在整个循环完成执行后,Swing才会重新绘制框架。
相反,您需要使用Swing计时器。当计时器触发时,您将调用逻辑。阅读Swing教程中有关如何使用Swing计时器的部分。
另外,请勿删除/添加面板。相反,您可以使用CardLayout和摇摆可见面板。再次阅读有关如何使用CardLayout的教程。
CardLayout