0

我遇到了这个相当奇怪的问题——单击按钮后,程序会初始化一个新的 JPanel 对象并尝试立即对其进行绘制。在 repaint() 之后,它将打开一个到服务器的套接字并执行一些交互。我遇到的问题是 repaint() 在套接字交互完成之前不会绘制屏幕。这是代码。

创建 GameGUI JPanel 对象

this.startmenu.setVisible(false);
//startmenu is what the user looks at prior to clicking the button
this.game = new GameGUI(this, this.saver,
                        new Player(this.startmenu.getPlayerDataSelection()), in);
this.game.run();//performs the socket interactions

构造 GameGUI JPanel 对象

this.game = new PlayingFieldGUI();
//this is a panel inside the panel
this.setLayout(new FlowLayout());
//just need game panel and users panel side by side
this.add(this.game);
this.client.add(this);//client is the jpanel that holds this
this.setVisible(true);
this.game.setVisible(true);
this.client.repaint();//attempting to repaint

run()函数为GameGUI. 完成套接字调用后,它会正确绘制背景。如果我要在交互过程中终止与套接字交互的服务器,则会发生异常抛出以及应该在 GameGUI 构造中发生的绘制。

4

1 回答 1

4

考虑发布一个SSCCE,没有它,很难说是什么问题。但是,根据您的描述,您可能会阻止事件调度线程(EDT) 与套接字交互。

repaint()只安排组件更新,不会立即触发paint()。绘画发生在 EDT 上,所以如果你阻止 EDT,那么你就是在干扰绘画机制。

考虑使用工作线程来处理长时间运行的任务。查看SwingWorker,它就是为此目的而设计的。另请参阅Swing 中的并发以了解有关 EDT 的更多详细信息。

于 2012-10-07T02:25:03.747 回答