Item 1: swing界面锁死

程序中用swing组件时应注意,任何java程序都是由主线程中的main()方法开始执行,当main()方法中的JFrame调用setVisiable(true)后,引发了另一个线程——事件分派线程,而actionPerformed()paintComponent()方法都是在事件分派线程中被调用,所以如果在actionPerformed()方法中有大量的耗时操作,将会导致用户界面无法响应用户请求,造成用户界面锁死。在这种情况下,最好在actionPerformed()方法中将耗时操作的程序部分移至一个新的线程中实现,这样程序在进行大量计算的同时又可以及时地响应用户请求。

例如:

package testswingguilock;

 

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

 

public class TestSwingGUILock {

       TestSwingGUILock() {

              initGUI();

       }

 

       void costMoreTime() {

              double d = 0;

              //耗费大量时间的操作

              for (int i = 0; i < Integer.MAX_VALUE; i++)

                     d += i;

              System.out.println("I have do so many works! The result is " + d);

       }

 

       void initGUI() {

              JButton jbutton = new JButton("Start");

              jbutton.addActionListener(new ActionListener() {

                     public void actionPerformed(ActionEvent e) {

                            System.out.println("You have pressed me!");

                            //将耗时操作放置在新的线程内完成

                            new Thread(new Runnable() {

                                   public void run() {

                                          costMoreTime();

                                   }

                            }).start();

                     }

              });

              JFrame jframe = new JFrame();

              Container container = new Container();

              container.setLayout(new BorderLayout());

              container.add(jbutton, BorderLayout.SOUTH);

              jframe.setContentPane(container);

              jframe.setSize(200, 200);

              jframe.setVisible(true);

              jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       }

 

       public static void main(String[] args) {

              new TestSwingGUILock();

       }

}

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值