【问题标题】:Pressing JRadiobutton freezes GUI按下 JRadiobutton 冻结 GUI
【发布时间】: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


【解决方案1】:

你可以看看使用 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

【讨论】:

  • 这就是我提到 SwingUtilities 时的意思。那我把它加回答案中。
【解决方案2】:

只在事件处理中放入最少的 GUI 更新,其余的非 GUI,使用Threads。
顺便说一句,setVisible 后面不需要repaint

【讨论】:

  • 注释no repaint is required after setVisible对于简单组件是正确的,但如果添加或删除组件,或者如果需要动画,则不是正确的。
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2020-08-06
  • 2015-04-08
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多