逐步更新JPanel

时间:2015-02-21 01:53:43

标签: java swing

我试图在JPanel中逐步显示algorythm如何填充矩阵。

事情是我刚学会Thread.Sleep(number)实际上冻结了GUI,我不认为我可以使用Swing Timers。所以我没有想法了。

首先,我有一个 JPanel1 ,它有一个JTextField和一个Button。按下按钮时,会在其中创建一个带有 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();
           }
       }
}

锦标赛是使用algorythm保存方法的类。我将 panel2 对象作为参数传递给" Tournament"以便包含algorythm的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);
               }

           }
    }

setCell(int x, int y, int z)方法根据行号和列号更改JPanel2上组件的值。

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

1 个答案:

答案 0 :(得分:4)

您可以使用SwingWorker来包含循环代码,然后在循环内部,您可以&#34;发布&#34;用于更新GUI的值。在process()的{​​{1}}方法中,您可以使用Thread.sleep(...)。

阅读Concurrency上Swing教程中的部分,了解更多信息和工作示例。

如果您想使用Swing Timer,您需要重新编码一下代码。基本上每次Timer触发时你都会增加&#34; j&#34;变量。什么时候&#34; J&#34;如果大于最大值,则将其重置为&#34; 0&#34;并增加&#34; I&#34;变量。然后更新单元格并调用repaint()。

相关问题