我是Swing的新手,所以这似乎是一个非常天真的问题。
我有一个JFrame,它显示一个初始语句和两个radiobuttons。 RadioButton1是Accept,RadioButton2是Reject。如果用户选择“接受”,则程序继续。所以我为Accept创建了一个ActionListener,以便我的其余代码都在这个ActionListener中。但是,只要用户按下Accept,GUI就会冻结。按Reject只是存在于程序之外。
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被冻结。
当用户按下Accept时,有更好的方法可以继续吗?
答案 0 :(得分:6)
您可以查看使用SwingWorker类。
基本上,Java Swing应用程序是单线程的,如果您执行任何进程密集型任务,控件将转移到该部分代码并且UI挂起,等待控制权交还。
编辑:您还可以查看SwingUtilities类。
编辑:使用SwingWorker类的基本信息:
您可以创建一个扩展SwingWorker并实现public String doInBackground() {
/*Do Stuff here*/
}
方法的新类。在ActionListener事件中,创建SwingWorker的实例并调用swingWorkerObject.execute()
方法以启动doInBackground方法执行。
此处有更多详情:http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html
答案 1 :(得分:2)
仅在事件处理中放置所需的最低GUI更新,对于其余非GUI ,请使用Thread
s。
顺便说一句,repaint
之后不需要setVisible
。