【发布时间】:2012-10-15 04:53:54
【问题描述】:
我是 Swing 新手,所以这似乎是一个非常幼稚的问题。
我有一个显示初始语句和两个单选按钮的 JFrame。 RadioButton1 是接受,RadioButton2 是拒绝。如果用户选择接受,则程序继续。所以我为 Accept 创建了一个 ActionListener,这样我的其余代码就在这个 ActionListener 中。然而,一旦用户按下接受,GUI 就会冻结。按拒绝只是存在于程序之外。
public void game() throws Exception
{
jTextArea1.setLineWrap(true);
jTextArea1.setWrapStyleWord(true);
jTextArea1.setText("Please choose Accept or Reject");
jRadioButton1.setVisible(true);
jRadioButton2.setVisible(true);
jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jRadioButton1.setVisible(false);
jRadioButton2.setVisible(false);
repaint();
//more code
});
}
在此之后,我与服务器建立了连接,它工作正常,因为当我使用 System.out.println() 时,所有输出都很好,只是 GUI 被冻结了。
当用户按下接受时,是否有更好的方式继续?
【问题讨论】:
-
您的问题出在
//more code部分。您正在 Swing 事件线程上调用一个长时间运行的进程,该进程将占用该线程,阻止它绘制 GUI 或与用户交互,从而有效地冻结您的应用程序。解决方案是使用 SwingWorker 进行后台线程。 -
更多信息请阅读Concurrency in Swing。
-
不需要
repaint呼叫顺便说一句。调用setVisible(false)会自动触发重绘
标签: java swing jtextarea jradiobutton