我正在编写一个简单的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
}
}
});
这就是代码。我希望每个数字单独显示,中间间隔一秒,但是当它站立时,框架会变成空白一段时间,并突然显示所有数字显示的结果,一旦完成。有人可以帮忙吗?谢谢。
答案 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项目。
在此过程中,我发现GUI不是我想要的同时更新。我尝试了很多方法来解决它。最终的解决方案是放弃在板上添加JLabel或JPanel(JFrame),而是使用setIcon或setText与帧进行更好的通信。嗯,这只是我个人的经历。希望可以为您的项目提供帮助。