Hi Joe,

The trick is to not even try to load that much data into the browser.  
We use the SmartGWT widget library which has very good support for 
virtual pagination of lists and comboboxes.  By default, it only loads 
the first 75 rows and then as the user scrolls down, calls are made back 
to the server to retrieve the desired data - which is then shown to the 
user.  There is an occasional delay when the user sees blank space which 
is then filled in when the data comes in.  But overall, it is a great 
solution -we're viewing tables with thousands of rows and seeing better 
performance than our old Swing-based application.

Tom


Joe Larson wrote:
> I am having a performance problem.  I am trying to build a page that
> allows the user to select from a fairly large list of objects (up to
> 20,000).  We have filtering capabilities to trim the list so the user
> doesn't have to scroll through all of them.  It's a reasonable UI.
>
> Unfortunately, I only get decent performance on Safari.  IE6 is
> exceptionally miserable.  It's okay when the list has 100 items, but
> it crashes as we exceed 300.  So I've been experimenting, and I
> haven't found a way around it.
>
> So I created a sample app.  All I did was populate an
> ArrayList<String> with 20,000 fairly short strings that I read out of
> the HTML file.  Under Safari 4 on a G5 Mac Pro, this is almost
> instant.  Under IE6 on a similar age Windows box, it's taking 4
> minutes.  Firefox on the G5 runs out of memory.
>
> Is it possible to store large amounts of data in my GWT applications?
> Or do I have to store fairly small amounts of data and go back and
> forth to the server a lot?  If it's the latter, I may as well just go
> back to what we used to do (WebObjects).
>
> I'm including my little sample program.  Maybe there's something
> obvious that I can do?
>
> -Joe
>
> --- GWTMinimum.java ---
> package com.missionmode.gwtminimum.client;
>
> import java.util.*;
>
> import com.google.gwt.core.client.*;
> import com.google.gwt.user.client.*;
> import com.google.gwt.user.client.ui.*;
>
> /**
>  * Entry point classes define <code>onModuleLoad()</code>.
>  */
> public class GWTMinimum implements EntryPoint {
>       public FlexTable                        panel;
>       public Button                           loadBtn;
>       public Button                           displayBtn;
>       public ListBox                          listBox;
>       public Label                            label;
>       public ArrayList<String>        usernames = new ArrayList<String>();
>       public String[] parts;
>
>       /**
>        * This is the entry point method.
>        */
>       public void onModuleLoad() {
>               panel = new FlexTable();
>               RootPanel.get("web2").add(panel);
>
>               loadBtn = new Button("Click to start load");
>               panel.setWidget(0, 0, loadBtn);
>
>               loadBtn.addClickListener(new ClickListener() {
>                       public void onClick(Widget sender) {
>                               loadUsers();
>                       }
>               });
>       }
>
>       /**
>        * We've loaded the user table.  Set up so they
>        * can press another button to display the data.
>        */
>       public void setupForDisplay() {
>               displayBtn = new Button("Click to Display");
>               panel.setWidget(0, 1, displayBtn);
>               displayBtn.addClickListener(new ClickListener() {
>                       public void onClick(Widget sender) {
>                               showUsers();
>                       }
>               });
>       }
>
>       /**
>        * Load the users from the HTML page.
>        */
>       public void loadUsers() {
>               if (parts == null) {
>                       String str = stringFromDocument("users");
>                       parts = str.split("===");
>                       loadBtn.setText("Click me again");
>               }
>               else {
>                       for (String name : parts) {
>                               name = name.trim();
>                               if (name.length() > 0) {
>                                       usernames.add(name);
>                               }
>                       }
>                       showCount();
>                       setupForDisplay();
>               }
>       }
>
>       /**
>        * Just show how many users were actually loaded.
>        */
>       public void showCount() {
>               label = new Label("Total user count: " + usernames.size());
>               panel.setWidget(1, 0, label);
>       }
>
>       /**
>        * Show the loaded users.
>        */
>       public void showUsers() {
>               try {
>                       listBox = new ListBox();
>                       listBox.setVisibleItemCount(20);
>                       panel.setWidget(2, 0, listBox);
>                       for (String str : usernames) {
>                               listBox.addItem(str);
>                       }
>               }
>               catch (Exception e) {
>                       panel.setText(3, 0, "Error: " + e.getMessage());
>               }
>       }
>
>     /**
>      * Return a string from the document.
>      */
>     public String stringFromDocument(String elementName) {
>       String retVal = "";
>       Element params = DOM.getElementById(elementName);
>         if (params != null) {
>             retVal = DOM.getInnerText(params);
>         }
>       return retVal;
>     }
> }
>
> --- Foo.html ---
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
> <html>
>     <head>
>         <meta http-equiv="content-type" content="text/html;
> charset=UTF-8">
>         <title>GWTMinimum</title>
>         <script type="text/javascript" language="javascript"
> src="com.missionmode.gwtminimum.GWTMinimum.nocache.js"></script>
>     </head>
>     <body>
>         <div id="web2"></div>
> <p id="users" style="display: none;">
> User 0===
> User 1===
> User 2===
> Repeat more users as desired===
> </p>
>     </body>
> </html>
>
> >
>   


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to Google-Web-Toolkit@googlegroups.com
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to