3

我正在编写一个带有图形显示的简单 Knight's Tour 程序。我已经将它编写为与控制台一起使用,现在我正在尝试传输该代码以便它与摇摆一起使用。我有一个按钮,其动作侦听器启动并操作该过程。这是代码:

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

4 回答 4

5

把所有答案放在一起

1.不要调用sleep(int)wait(int)在从AWT / Swing Listener执行的代码期间,使用

或者

2.after add//remove已经modify可见的容器需要调用

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

3.setVisible必须invokeLater在代码里面包裹你的本性

于 2012-05-27T16:27:40.730 回答
4

您的delay方法阻止了事件调度线程,避免了这些组件的重绘。查看Swing 并发教程以获取有关 Swing 和线程的更多信息。

您的问题的可能解决方案是使用SwingTimer而不是delay方法

于 2012-05-27T15:41:36.883 回答
-1

当你在那个while循环中时,repaint()永远不会被调用。这就是为什么在方法结束之前您什么都看不到的原因。

于 2012-05-27T15:44:07.307 回答
-1

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

在此过程中,我发现 GUI 没有按照我的意愿同时更新。我尝试了很多方法来解决它。最终的解决方案是放弃使用在板子上添加 JLabels 或 JPanels(JFrame),而是使用 setIcon 或 setText 与框架进行更好的通信。嗯,这只是我个人的经验。希望对您的项目有所帮助。

于 2012-05-27T15:49:51.013 回答