SWING程序的执行效率不高 请问怎么提高效率:)

解决方案 »

  1.   

    反对,Swing的效率已经很优化了
    如果楼主嫌它慢,建议换cpu和mem,呵呵有时候,我们发现自己编的C++程序也会慢;
    有时候,我们采用了opengl或DX的画图都会闪;
    原因嘛就不说了...还有,swing的native code的确实现了图形加速,这是真的
      

  2.   

    但我是要在IA设备上实现SWING的 受资源限制 原先是用的AWT的一部分 现在想把AWT的换成SWING 增强一下图形功能 问下 有什么办法
      

  3.   

    孤陋寡闻了,呵呵,不查我还不知道原来IA中的A是指Appliance,楼主做的领域好超前啊。
    --
    Swing界面优化,我知道的和采用过的策略有几个
    1、MemoryBuffer
       实际上,系统GDI肯定实现了这样的优化,缓存模型工作原理简单来说,
    就是内存画布管理和BitBlt引擎“拷屏”。我们自己的缓存方法,就是切换
    对象可见/不可见,尽量避免直接修改可见对象,把窗体子元素的组织放到
    幕后执行。用最近最久未用算法,缓冲几个最近被访问的窗体,以避免重新
    或反复构造最常用的窗体界面。
    2、multiThread
       多线程技术自然不用说,Java天然对多线程机制提供良好的支持,这种
    技术尤其和后面的策略配合使用。
    3、LazyLoad
       资源懒加载,在图形处理和数据处理中,都是必不可少的应用策略。举例
    来说,比如界面上有个表格,它要显示一些数据,而这些数据来自文件,那么
    可以分四步:
              组件加载提示;
              加载一个空表格;
              数据加载提示;
              加载数据到表格;
       在界面上应用,那就是尽量以最快的速度,先显示一个粗糙视图,然后再
    使用异步线程绘制细节。
    4、"Loading..."
       玩大型game我们经常要耐心等待它"Loading",这是不得已而为之的策略。(
    即使我们相信暴雪程序员的优化工作已经做足了,我们还是会在他们的游戏中,
    看到这样的字眼。)(再比如,CSDN社区左边那棵树,展开节点先看到了什么?
    ——正在加载 请稍候 ...)这不是最好的,最典型的代表应该是windows系统里面
    最常见的ProcessBar,至少能让用户知道要等多久。
       通常,用户不介意在友好提示下,等一会儿,因为他们也承认自己的计算机
    并不是每次都能一次做完所有的事情。
       一个好的界面,不是要求干什么都最快,而是要求所有的等待都在用户可容忍
    的程度内。
    --
    比较笼统,对于具体问题可以具体讨论
    欢迎讨论
      

  4.   

    呵呵 我也是刚刚接触这个 我现在是想用SWING代替原来的AWT 但是必须要是 楼上所说的我也看过 还有其他的几个办法 当时问题是 这些方法用了后 对程序运行效率有多大改进 谢谢
    -----------------------------------------------------------------------------------Java档案文件(JAR文件)是根据JavaBean标准压缩的文件,是发布JavaBean组件的主要方式和推荐方式。JAR档案有助于减少文件体积,缩短下载时间。例如,它有助于Applet提高启动速度。一个JAR文件可以包含一个或者多个相关的Bean以及支持文件,比如图形、声音、HTML和其他资源。
        要在HTML/JSP文件中指定JAR文件,只需在Applet标记中加入ARCHIVE = "name.jar"声明。
        3.2 提示Applet装入进程
        你是否看到过使用Applet的网站,注意到在应该运行Applet的地方出现了一个占位符?当Applet的下载时间较长时,会发生什么事情?最大的可能就是用户掉头离去。在这种情况下,显示一个Applet正在下载的信息无疑有助于鼓励用户继续等待。
        下面我们来看看一种具体的实现方法。首先创建一个很小的Applet,该Applet负责在后台下载正式的Applet:     import java.applet.Applet;import java.applet.AppletStub;import java.awt.Label;import java.awt.Graphics;import java.awt.GridLayout; public class PreLoader extends Applet implements Runnable, AppletStub {    String largeAppletName;    Label label;    public void init() {       // 要求装载的正式Applet       largeAppletName = getParameter("applet");       // “请稍等”提示信息       label = new Label("请稍等..." + largeAppletName);       add(label);    }     public void run(){       try {          // 获得待装载Applet的类          Class largeAppletClass = Class.forName(largeAppletName);           // 创建待装载Applet的实例         Applet largeApplet = (Applet)largeAppletClass.newInstance();           // 设置该Applet的Stub程序          largeApplet.setStub(this);           // 取消“请稍等”信息         remove(label);          // 设置布局         setLayout(new GridLayout(1, 0));         add(largeApplet);          // 显示正式的Applet         largeApplet.init();         largeApplet.start();      }      catch (Exception ex) {         // 显示错误信息         label.setText("不能装入指定的Applet");      }       // 刷新屏幕      validate();   }    public void appletResize(int width, int height) {         // 把appletResize调用从stub程序传递到Applet        resize(width, height);   }}
     
        编译后的代码小于2K,下载速度很快。代码中有几个地方值得注意。首先,PreLoader实现了AppletStub接口。一般地,Applet从调用者判断自己的codebase。在本例中,我们必须调用setStub()告诉Applet到哪里提取这个信息。另一个值得注意的地方是,AppletStub接口包含许多和Applet类一样的方法,但appletResize()方法除外。这里我们把对appletResize()方法的调用传递给了resize()方法。
        3.3 在画出图形之前预先装入它
        ImageObserver接口可用来接收图形装入的提示信息。ImageObserver接口只有一个方法imageUpdate(),能够用一次repaint()操作在屏幕上画出图形。下面提供了一个例子。     public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) {          if ((flags & ALLBITS) !=0 {               repaint();          }          else if (flags & (ERROR |ABORT )) != 0) {               error = true;               // 文件没有找到,考虑显示一个占位符               repaint();           }           return (flags & (ALLBITS | ERROR| ABORT)) == 0;} 
     
        当图形信息可用时,imageUpdate()方法被调用。如果需要进一步更新,该方法返回true;如果所需信息已经得到,该方法返回false。
        3.4 覆盖update方法
        update()方法的默认动作是清除屏幕,然后调用paint()方法。如果使用默认的update()方法,频繁使用图形的应用可能出现显示闪烁现象。要避免在paint()调用之前的屏幕清除操作,只需按照如下方式覆盖update()方法:
         public void update(Gra