Javax.swing:如何正确显示组件的更新?

时间:2012-05-27 15:36:48

标签: java swing

我正在编写一个简单的Knight's Tour程序,带有图形显示。我已经编写了它来使用控制台,现在我正在尝试将代码转移到它以便它与swing一起工作。我有一个按钮,其动作监听器启动并运行该过程。这是代码:

askButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            int[][] tour = getBoard(); // generates a matrix representing a successful knight's tour
            int count = 0;

            while (count < 64) {
                count++;
                Location loc = searchFor(count, tour); //gets the location of the int "count" inside the matrix "tour"
                board.setVisible(false); //board contains a matrix of JPanels called "grid".
                grid[loc.row()][loc.column()].add(new JLabel("" + count)); //adds JLabel to JPanel with the proper number
                board.setVisible(true); //reset to visible to show changes
                delay(1000); //wait 1000 milliseconds - one second - to allow user to view changes
            }
        }
    });

这就是代码。我希望每个数字单独显示,中间间隔一秒,但是当它站立时,框架会变成空白一段时间,并突然显示所有数字显示的结果,一旦完成。有人可以帮忙吗?谢谢。

4 个答案:

答案 0 :(得分:5)

将所有答案放在一起

1.在AWT / Swing Listener执行的代码中,不要拨打sleep(int)wait(int),请使用

2.在add / remove / modify之后,已经可见的容器需要调用

  • revalidate()repaint(),然后是setVisible()

3. setVisible必须在invokeLater内包裹在您自然的代码中

答案 1 :(得分:4)

您的delay方法会阻止事件调度线程,从而避免重新绘制这些组件。有关Swing和线程的更多信息,请查看Swing Concurrency Tutorial

问题的可能解决方案是使用Swing Timer代替delay方法

答案 2 :(得分:-1)

当您在while循环中时,永远不会调用repaint()。这就是为什么在方法结束之前你没有看到任何东西的原因。

答案 3 :(得分:-1)

首先,在GUI上进行一些更改后,尝试调用revalidate()和repaint()。其次,我还有一个与我的CSE助手类似的GUI项目。

在此过程中,我发现GU​​I不是我想要的同时更新。我尝试了很多方法来解决它。最终的解决方案是放弃在板上添加JLabel或JPanel(JFrame),而是使用setIcon或setText与帧进行更好的通信。嗯,这只是我个人的经历。希望可以为您的项目提供帮助。