Java JPanel没有绘画

时间:2012-10-07 01:45:15

标签: java swing jpanel paint repaint

我遇到了这个相当奇怪的问题 - 点击按钮后,程序会初始化一个新的JPanel对象并尝试立即绘制它。在重绘()之后,它将打开一个到服务器的套接字并执行一些交互。我遇到的问题是,在套接字交互完成之前,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构造中发生的绘制。

1 个答案:

答案 0 :(得分:4)

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

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

考虑使用工作线程来处理长时间运行的任务。查看SwingWorker,它是专为此目的而设计的。有关EDT的更多详细信息,请查看Concurrency in Swing