Java 逐步更新JPanel

Java 逐步更新JPanel,java,swing,Java,Swing,我试图在JPanel中演示一个算法如何一步一步地填充一个矩阵 问题是我刚刚学会了线程。睡眠(数字)实际上冻结了GUI,我不认为我可以使用Swing定时器来实现这一点。所以我没有主意了 首先,我有一个JPanel1,它有一个JTextField和一个按钮。按下按钮时,将创建一个包含JPanel2的额外框架,该框架将保存表格的表示形式,其大小由上一个文本字段中的数字确定。这一切都由我的控件类处理 Public class Control implements ActionListener {

我试图在JPanel中演示一个算法如何一步一步地填充一个矩阵

问题是我刚刚学会了线程。睡眠(数字)实际上冻结了GUI,我不认为我可以使用Swing定时器来实现这一点。所以我没有主意了

首先,我有一个JPanel1,它有一个JTextField和一个按钮。按下按钮时,将创建一个包含JPanel2的额外框架,该框架将保存表格的表示形式,其大小由上一个文本字段中的数字确定。这一切都由我的控件类处理

Public class Control implements ActionListener
{
    JPanel1 panel;

    public Control(JPanel1 vista)
    {
        this.panel = vista;
    }

    public void actionPerformed(ActionEvent e) 
    {
       if(e.getActionCommand().equals("Push"))
       {
           int num = panel.getNumber();

           if(((num & (num - 1)) != 0) || num == 1 || num == 0)
           {
               panel.isError();
           }
           else
           {
               panel.clean();

               JPanel2 panel2 = new JPanel2(num);

               JFrame window = new JFrame("Tournament");

                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                window.setContentPane( (JPanel) panel2);
                window.pack();
                window.setVisible(true);

               Tournament t = new Tournament (num,panel2);
               t.init();
           }
       }
}
锦标赛是使用算法保存方法的类。我将panel2对象作为参数传递给“Tornament”,因此包含算法的
init()
方法将是更新面板的方法

public void init()
    {

        for(int i=0;i < this.matrix.length;i++)
           {
               for(int j = 0; j < matrix[i].length; j++)
               {
                   matrix[i][j] = 0;
                   panel2.setCell(matrix[i][j],i,j);
               }

           }
    }
public void init()
{
for(int i=0;i
setCell(intx,inty,intz)
方法根据行数和列数更改JPanel2上组件的值


那么,我如何才能使更改逐步显示?我的意思是让程序每次调用
setCell
方法时都等待。

您可以使用
SwingWorker
来包含循环代码,然后在循环中可以“发布”用于更新GUI的值。在
SwingWorker
process()
方法中,可以使用Thread.sleep(…)

有关更多信息和工作示例,请阅读上Swing教程的部分


如果您想使用Swing计时器,则需要稍微重新构造代码。基本上每次定时器启动时,您都会增加“j”变量。当“J”大于最大值时,将其重置为“0”,并增加“I”变量。然后更新单元格并调用repaint()。

您可以使用
SwingWorker
来包含循环代码,然后在循环中可以“发布”用于更新GUI的值。在
SwingWorker
process()
方法中,可以使用Thread.sleep(…)

有关更多信息和工作示例,请阅读上Swing教程的部分


如果您想使用Swing计时器,则需要稍微重新构造代码。基本上每次定时器启动时,您都会增加“j”变量。当“J”大于最大值时,将其重置为“0”,并增加“I”变量。然后更新单元格并调用repaint()。

1)使用Swing
计时器调用
repaint()
2)为了更快地获得更好的帮助,发布一个(最小完整的可验证示例)或(简短、自包含、正确的示例)。我将首先尝试使用repaint来调用Swing计时器。我还是这个论坛的新手,所以谢谢你的建议。1)使用Swing
计时器调用
重新绘制()
2)为了更快地获得更好的帮助,发布一个(最简单的完整可验证示例)或(简短、自含、正确的示例)。我会先尝试使用重新绘制的东西来访问Swing计时器。我对这个论坛还很陌生,所以谢谢你的建议。我想最好的办法是和SwingWorker合作,我只需要找到一种方法来公布这些数字。谢谢我想最好的方法是和SwingWorker合作,我只需要找到一种方法来公布这些数字。谢谢