3

我是 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 被冻结。

当用户按下接受时,是否有更好的方法继续?

4

2 回答 2

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

于 2012-10-25T03:53:13.307 回答
2

仅在事件处理中放置最少需要的 GUI 更新,其余的非 GUI使用Threads.
顺便说一句, norepaint​​之后是必需的setVisible

于 2012-10-25T03:53:01.290 回答