当前位置: 首页 > 面试题库 >

可视化循环内的JPanel变化

施阳曜
2023-03-14
问题内容

我是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的教程。



 类似资料:
  • 问题内容: 为了在用户单击“清除按钮”时初始化a上的所有,我需要遍历(而不是将所有单个字段都设置为“”)。 我如何使用for-each循环来遍历s的搜索? 问题答案: 但是,如果您具有更深层嵌套的JTextField,则可以使用以下递归形式: 编辑: Tom Hawtin的 一个样本 -粗线 建议将在您的框架班级中列出: 并在初始化单个文本字段时,将它们添加到此列表中: 当用户单击清除按钮时,只需

  • 问题内容: 为什么以下工作正常? 但是据说这是危险的/不正确的: 是否需要在循环外声明变量? 问题答案: 局部变量的范围应始终尽可能小。 在你的例子我相信是不会使用的外while循环,否则你就不会问这个问题,因为它声明的内部while循环不会是一个选项,因为它不会编译。 所以,既然是不使用外循环,在尽可能小的范围是内 while循环。 所以,答案是着重那绝对应该被while循环内声明。没有,没有,

  • 您好,我对jquery没有什么问题。首先,我有: 大众BORA 1.9TDI 1990 1995 奥迪A3 2.0TFSI 2006 2008 但我想实现: VW BORA 1.9TDI 1990 VW BORA 1.9TDI 1991 VW BORA 1.9TDI 1992 VW BORA 1.9TDI 1993 VW BORA 1.9TDI 1994 VW BORA 1.9TDI 1995 A

  • 要显示以下双变量函数z = f (x,y)的图像: 分别对函数的定义域生成含有重复行与列的X和Y矩阵。 用X和Y来计算函数的图像。 函数meshgrid把由单向量或双向量x,y指定的定义域变换成矩阵X和Y,以用于计算双变量函数。X的行和Y的列分别是x和y向量的复制。 举例-sinc函数图像 此例计算并作出sinc函数sin(r)/r的在x和y方向间的图象。R是到原点的距离,出现在矩阵中心。添加ep

  • 循环变量内建函数从 FreeMarker 2.3.23 版本开始存在。 这些内建函数只能用于list 和 items 指令 的循环变量 (也可以用于已经废弃的 foreach 指令)。 下面是一些说明(loopVar?index 在可以列表的值中进行迭代,返回从0开始的索引): <#-- Note: x is a loop variable --> <#list ['a', 'b', 'c'] a

  • 问题内容: 我已经在Python中工作了一段时间,并且已经使用“ try”和“ except”解决了这个问题,但是我想知道是否还有另一种方法可以解决它。 基本上我想创建一个这样的字典: 因此,如果我有一个具有以下内容的变量: 我实现example_dictionary的方法是: 我希望我的问题很清楚,有人可以帮助我。 谢谢。 问题答案: 您的代码未将元素追加到列表;您将列表替换为单个元素。要访问现