小编典典

可视化循环内的JPanel变化

java

我是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);
        }
    });
}}

阅读 190

收藏
2020-11-30

共1个答案

小编典典

不要使用循环。只有在整个循环完成执行后,Swing才会重新绘制框架。

相反,您需要使用Swing计时器。当计时器触发时,您将调用逻辑。阅读Swing教程中有关如何使用Swing计时器的部分

另外,请勿删除/添加面板。相反,您可以使用CardLayout和摇摆可见面板。再次阅读有关如何使用CardLayout的教程。

2020-11-30