| Any efficient way to display a huge amount of items? [message #318005] |
Wed, 18 July 2007 10:29  |
Eclipse User |
|
|
|
Originally posted by: ku_long.hotmail.com
Hey,
I am trying to create a eclipse view to display memory information
when our projects are running. It turned out that I always have about
50 thousands (even more) items to display. For some reason, I am not
supposed to follow the eclipse tradition, e.g. just display a default
number of items first and let user to set filter. I am asked to display
them all. We have a similar tools which was developed using general
java awt and swing lib. It displays all the itms in a table, and seems
not too slow (e.g. for 50 thousands item, it takes 5-6 seconds to display).
But when I try to use a TreeView wieh contain provider and label provider
to display them, it takes me about 1 minute or more to display the whole
bunch of items. Is there any other way that can handle this kind of
huge amount of items?
Thanks.
|
|
|
|
|
|
|
|
| Re: Any efficient way to display a huge amount of items? [message #318025 is a reply to message #318019] |
Wed, 18 July 2007 16:49   |
Eclipse User |
|
|
|
Originally posted by: ku_long.hotmail.com
Hey,
I tried to design a simple program to see how to use
ILazyTreeContainProvider, but it seems it stuck on the
Tree.setItemCount(int) for a long time when I set the
number of item as a big number such as 50000; and also
got an out a java.lang.StackOverflowError when the UI
was displayed(actually the UI was no displayed due to
the exception). I attach my test code as following, anyone
can point out what's wrong with it? It should pass the
compile if you have necessory eclipse libs included.
(Name of the test java file is: TreeViewTest.java)
Thanks.
/***************************************************
* My test code
****************************************************/
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ILazyContentProvider;
import org.eclipse.jface.viewers.ILazyTreeContentProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
public class TreeViewTest {
TreeViewer _viewer;
class MyContentProvider implements ILazyTreeContentProvider{
private TreeViewer _myViewer;
private Object[] _models;
public MyContentProvider(TreeViewer viewer){
_myViewer = viewer;
}
@Override
public Object getParent(Object element) {
// TODO Auto-generated method stub
return null;
}
@Override
public void updateChildCount(Object element, int currentChildCount) {
// TODO Auto-generated method stub
}
@Override
public void updateElement(Object parent, int index) {
_myViewer.replace(parent, index, _models[index]);
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object
newInput) {
if (newInput == null)
_models = new Object[0];
else
_models = ((List)newInput).toArray();
}
}
/**
* Label provider of objects tree view.
*/
class MyLabelProvider implements ITableLabelProvider {
/**
* (no java doc)
* @see ITableLabelProvider#getColumnImage(Object, int)
*/
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
/**
* (no java doc)
* @see ITableLabelProvider#getColumnText(Object, int)
*/
public String getColumnText(Object element, int columnIndex) {
MyModel model = (MyModel)element;
// System.out.println(element.toString() + " ColumnIndex: " +
columnIndex);
switch (columnIndex){
case 0:
return model.getName();
case 1:
return model.getType();
case 2:
return model.getComments();
default:
return "";
}
}
/**
* (no java doc)
* @see IBaseLabelProvider#addListener(ILabelProviderListener)
*/
public void addListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
/**
* (no java doc)
* @see IBaseLabelProvider#dispose()
*/
public void dispose() {
// TODO Auto-generated method stub
}
/**
* (no java doc)
* @see IBaseLabelProvider#isLabelProperty(Object, String)
*/
public boolean isLabelProperty(Object element, String property) {
// TODO Auto-generated method stub
return false;
}
/**
* (no java doc)
* @see IBaseLabelProvider#removeListener(ILabelProviderListener)
*/
public void removeListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
}
class MyModel {
public int counter;
private String type;
private String comments = "hello";
public MyModel(int counter) {
this.counter = counter;
}
public String getType(){
return counter % 2 == 0?"male":"female";
}
public String getName() {
return "Item " + this.counter;
}
public String getComments(){
return comments;
}
}
public TreeViewTest(Shell shell) {
shell.setText("TreeView Test");
// final TableViewer v = new TableViewer(shell, SWT.VIRTUAL);
_viewer = new TreeViewer(shell, SWT.VIRTUAL);
Tree tree = _viewer.getTree();
TreeColumn column1 = new TreeColumn(tree, SWT.CENTER);
column1.setText("Name");
column1.pack();
TreeColumn column2 = new TreeColumn(tree, SWT.CENTER);
column2.setText("Type");
column2.pack();
TreeColumn column3 = new TreeColumn(tree, SWT.CENTER);
column3.setText("Comments");
column3.pack();
tree.setLinesVisible(true);
tree.setHeaderVisible(true);
_viewer.setLabelProvider(new MyLabelProvider());
_viewer.setContentProvider(new MyContentProvider(_viewer));
List model = createModel();
long start = System.currentTimeMillis();
_viewer.setInput(model);
System.out.println("Used " + (System.currentTimeMillis() - start) + "
milliseconds to display");
start = System.currentTimeMillis();
tree.setItemCount(model.size());
System.out.println("Used " + (System.currentTimeMillis() - start) + "
milliseconds to set size");
}
private List createModel() {
List list = new ArrayList();
for (int i = 0; i < 10000; i++) {
list.add(new MyModel(i));
}
return list;
}
/**
* @param args
*/
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
new TreeViewTest(shell);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.03902 seconds