带有响应式 UI 的 Swing

如何解决带有响应式 UI 的 Swing

我有一个主类、一个 UI 类和一个处理从 UI 到主回调的接口:

主要内容

package clascomms;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author stef
 */
public class ClassComms implements Handler{

    private final ClassCommsUi ui;
    
    public ClassComms() {
        // private final ClassCommsUi ui;
        ui = new ClassCommsUi(this,"Click1","Click2");
}
    
    @Override
    public void btn1Clicked(){
        try {
            // this code should run if button 1 is clicked
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            Logger.getLogger(ClassComms.class.getName()).log(Level.SEVERE,null,ex);
        }
        System.out.println("bt1Clicked");
    }
    @Override
     public void btn2Clicked(){
    // this code should run if button 2 is clicked
         System.out.println("bt2Clicked");
    }
    
     
    public static void main(String[] args) {
       ClassComms thisOne = new ClassComms();
    }
    
    
}

界面:

package clascomms;

/**
 *
 * @author stef
 */
public class ClassCommsUi extends javax.swing.JFrame {
    private Handler mainClass;
    public ClassCommsUi(Handler mainClass,String btn1,String btn2) {
        this.mainClass = mainClass;
        initComponents();
        jButton1.setText(btn1);
        jButton2.setText(btn2);
        this.setVisible(true);
    }

   
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloSEOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("jButton2");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(26,26,26)
                .addComponent(jButton1)
                .addGap(27,27,27)
                .addComponent(jButton2)
                .addContainerGap(33,Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(26,26)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addContainerGap(28,Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // Todo add your handling code here:
        // If this action happens,method btn1Clicked() in main Class should be called 
    
      mainClass.btn1Clicked();
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // Todo add your handling code here:
        // If this action happens,method btn2Clicked() in main Class should be called 
        mainClass.btn2Clicked();
    }    
   
    public void quit(){}

    
   

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    // End of variables declaration                   
}

最后是界面:

package clascomms;

/**
 *
 * @author stef
 */
public interface Handler {
    public void btn1Clicked();
    public void btn2Clicked();
     
    
}

如你所见,主类中有一个 5 秒的 Thread.sleep()... 当我点击按钮时,它会一直按下直到睡眠结束 - 用户界面保持 100% 无响应。 是否有一种简单(NOOB 在这里...)的方法来让 UI 保持响应?

解决方法

您正在阻止 EDT(事件调度线程)。所有与 Swing 相关的代码都在 EDT 上运行,其中包括您的 actionPerformed。尝试在后台线程上休眠。

@Override
public void btn1Clicked(){
   new SwingWorker<Void,Void>() {

      @Override
      protected void doInBackground() throws Exception {
         try {
            Thread.sleep(5000);
         } catch (InterruptedException ex) {
            Logger.getLogger(ClassComms.class.getName()).log(Level.SEVERE,null,ex);
         }
         System.out.println("bt1Clicked");
      }
   }().execute();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?