Java 按下JRadiobutton可冻结GUI
我对Swing还不熟悉,所以这似乎是一个非常幼稚的问题 我有一个JFrame,它显示一个初始语句和两个单选按钮。RadioButton1为接受,RadioButton2为拒绝。如果用户选择接受,程序将继续。因此,我为Accept创建了一个ActionListener,以便我的其余代码都在这个ActionListener中。但是,只要用户按下Accept,GUI就会冻结。按“拒绝”按钮仅存在于程序之外Java 按下JRadiobutton可冻结GUI,java,swing,jtextarea,jradiobutton,Java,Swing,Jtextarea,Jradiobutton,我对Swing还不熟悉,所以这似乎是一个非常幼稚的问题 我有一个JFrame,它显示一个初始语句和两个单选按钮。RadioButton1为接受,RadioButton2为拒绝。如果用户选择接受,程序将继续。因此,我为Accept创建了一个ActionListener,以便我的其余代码都在这个ActionListener中。但是,只要用户按下Accept,GUI就会冻结。按“拒绝”按钮仅存在于程序之外 public void game() throws Exception {
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时,是否有更好的方法继续?仅在事件处理中放置所需的最少GUI更新,对于其余的非GUI,请使用
线程
s.顺便说一下,在使用SwingWorker类查看
setVisible
之后,不需要重新绘制
基本上,JavaSwing应用程序是单线程的,如果您执行了任何流程密集型任务,那么控制将转移到该代码段,UI将挂起,等待控制权返回
编辑:您还可以查看SwingUtilities类
编辑:有关使用SwingWorker类的基本信息:
您可以创建一个扩展SwingWorker的新类,并实现公共字符串doInBackground(){
/*在这里做事*/
}
方法。在ActionListener事件中,创建SwingWorker的一个实例,并调用swingWorkerObject.execute()
方法来启动doInBackground方法的执行
此处有更多详细信息:您的问题在//更多代码
部分。您正在Swing事件线程上调用一个长时间运行的进程,该进程将绑定该线程,从而阻止它绘制GUI或与用户交互,从而有效地冻结您的应用程序。解决方案是使用SwingWorker进行后台线程。有关这方面的更多信息,请阅读。不需要调用repait
call BTW。调用setVisible(false)
将自动触发重新绘制这就是我提到SwingUtilities时的意思。然后我会将其添加回答案。setVisible之后的注释无需重新绘制对于简单组件是正确的,但是如果添加或删除组件,或者如果需要动画,则注释不正确。