浅析Swing中actionPerformed()方法
程序中用Swing组件时应注意,任何java程序都是由主线程中的main()方法开始执行,当main()方法中的JFrame调用setVisiable(true) 后,引发了另一个线程——事件分派线程,而actionPerformed()方法及paintComponent()方法都是在事件分派Swing线程中被调用,所以如果在actionPerformed()方法中有大量的耗时操作,将会导致用户界面无法响应用户请求,造成用户界面锁死。在这种情况下,最好在 actionPerformed()方法中将耗时操作的程序部分移至一个新的Swing线程中实现,这样程序在进行大量计算的同时又可以及时地响应用户请求。
- packagetestswingguilock;
- importjavax.swing.*;
- importjava.awt.*;
- importjava.awt.event.*;
- publicclassTestSwingGUILock{
- TestSwingGUILock(){
- initGUI();
- }
- voidcostMoreTime(){
- doubled=0;
- //耗费大量时间的操作
- for(inti=0;i<Integer.MAX_VALUE;i++)
- d+=i;
- System.out.println("Ihavedosomanyworks!Theresultis"+d);
- }
- voidinitGUI(){
- JButtonjbutton=newJButton("Start");
- jbutton.addActionListener(newActionListener(){
- publicvoidactionPerformed(ActionEvente){
- System.out.println("Youhavepressedme!");
- //将耗时操作放置在新的线程内完成
- newThread(newRunnable(){
- publicvoidrun(){
- costMoreTime();
- }
- }).start();
- }
- });
- JFramejframe=newJFrame();
- Containercontainer=newContainer();
- container.setLayout(newBorderLayout());
- container.add(jbutton,BorderLayout.SOUTH);
- jframe.setContentPane(container);
- jframe.setSize(200,200);
- jframe.setVisible(true);
- jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- publicstaticvoidmain(String[]args){
- newTestSwingGUILock();
- }
- }
【编辑推荐】
- 浅谈Java Swing的连接数据库
- 介绍JFace、Swing、AWT和SWT
- 详解SwingWorker与Swing程序
- 介绍轻量级Swing组件
- Swing组件都扩展自JComponent
版权声明:
作者:后浪云
链接:https://www.idc.net/help/414015/
文章版权归作者所有,未经允许请勿转载。
THE END