当前位置:  技术问答>java相关

急!急!急!如何在电子地图上加“Loading...”,菜鸟求助各位大虾!!!

    来源: 互联网  发布时间:2015-03-29

    本文导语:  手头正做一个MapXtram+Oracle的电子地图Web发布的项目。验收时客户认为 传输速度太慢、等待时间长,要求加“Loading...”我做了几个效果不理想 都被部长毙掉了。不知如何实现图形天下、般若、各省市电子地图中调图片...

手头正做一个MapXtram+Oracle的电子地图Web发布的项目。验收时客户认为
传输速度太慢、等待时间长,要求加“Loading...”我做了几个效果不理想
都被部长毙掉了。不知如何实现图形天下、般若、各省市电子地图中调图片
传数据时激活“Loading...”,传输结束关闭“Loading...”
望各位大虾多多赐教,小弟这边先行谢过!!!

|
看有没有帮助

To write an applet that shows a splashscreen, we need to know what happens when applets (and java classes in general) are loaded. 
When you ask a java runtime to load a class (e.g. by giving it as a command-line argument to the java executable, or by loading a webpage containing an applet tag) the runtime tries to load that named class (e.g. "foo.class"). In general (as in this case), this can only complete once all the classes that foo depends on are also loaded. A class is dependant on any other class that: 

is a superclass of it. 
is an interface that it implements, or a superinterface of any such interface. 
that it explicitly references. 
Most of these will, in general, be system classes (part of the browser) and thus can be loaded very quickly (if they're not already loaded) - but (for applets that consist of a number of classes) the "root" class isn't finished loading (and thus can't run) until all other classes that it references are also loaded - and they aren't loaded until any classes they reference are loaded (and so on). 
So the reason that a big applet isn't able to do anything (like painting a "loading..." message) quickly is because the browser has to wait until all of the classes of the applet are downloaded. 

In order to have a "splashscreen" load quickly, and have it run before (and during) the loading of the rest of the applet, we have to break the explicit dependancy between the initial class and the other classes in the applet. The following example shows how to do this, and in the process shows off some of the amazing things you can do with the powerful java Classloader class. 

The example shows a tiny "loader" applet (initial.java) which serves to purposes: 

it displays the splash screen 
it references the rest of the applet (by string), causing the remaining applet code to load. 
The clever bit is that the loader doesn't explicitly reference the rest of the applet (in this case "second.java"), to the compiler doesn't pick this up as a dependancy - as far as it it concerned, initial is a freestanding class. Instead, initial references second programmatically, using the forName() method of class Class. Here's initial.java: 

    import java.awt.*;
    import java.applet.Applet;

    public class initial extends Applet implements Runnable {
        private String classToLoad;

        private void fetchClass(String className) {
            classToLoad = className;
            Thread t = new Thread(this);
            t.start();
        }
        
        public void run() {
            try {
                Class mainClass = Class.forName(classToLoad);
                Component mainInstance = 
                   (Component)mainClass.newInstance();
                add(mainInstance);
             }
             catch (Exception e) {
                 e.printStackTrace();
             }
        
             invalidate();
             validate();
         }
        
         /**
          *  Called when the applet is initialised -
          *  here we start the asynchronous load of the rest of
          *  the applet.
          */
         public void init() {                
             setLayout(new BorderLayout());
             fetchClass("second");
         }
        
         /**
          *  Display a simple message 
          */
         public void paint(Graphics g) {
             g.drawString("loading...",30,30);
         }
    }

And here's second.java, the source for our simple example second-phase: 


  import java.awt.*;

  public class second extends Canvas {
     public void paint(Graphics g){
       Dimension d = getSize();
       g.setColor(Color.green);
       g.fillRect(0,0,d.width, d.height);
     }
  }

You'll see from initial that it loads the subsequent code in a new thread - this is because Class.forName() blocks - if we didn't spawn a new thread then init() wouldn't terminate until second was loaded - and initial can't paint until its init() method exits. 

Here's the HTML code for loading the applet: 

  multi-stage applet
  
  

Notice that CODE points just to initial.class, not to subsequent classes like second.class - but the applet classloader will still need to be able to load second.class later, so it must be accessible, i.e. it must be in a place specified by the CODEBASE parameter. 

Now, ideally we'd have many classes in the second part, and the logical place to keep them would be a JAR file, but we can't name that JAR file in the applet's ARCHIVE parameter, as the applet environment always loads all the JARs mentioned in the ARCHIVE parameter, even if they don't appear to be referenced initially. Thus we're stuck loading individual classfiles across the network

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • QT显示电子地图


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3