2015-02-25 4 views
0

У меня проблема с производительностью с комбо в таблице. Когда я запускаю приложение, все в порядке. Я могу изменить значение комбо, и реакция таблицы в порядке. Но когда я очищаю стол и наполняю его, кажется, что есть катастрофическая потеря производительности. Когда я пытаюсь выбрать одну строку из таблицы, она занимает около 1-2 секунд, пока она не будет выбрана. Когда я нажимаю «Сбросить таблицу» -Баташка 5-10 раз, выбор строки занимает 5-6 секунд.Плохая производительность с SWT Combo в таблице

Сначала я думал, что должен утилизировать все после использования. Но это ничего не изменило. Я тоже пробовал это с текстовыми полями. Та же проблема. Первый раз производительность на приемлемом уровне. ударять сброс кнопку -> очень плохая производительность

Вот пример этой проблемы:

import org.eclipse.swt.SWT; 
import org.eclipse.swt.custom.TableEditor; 
import org.eclipse.swt.events.ModifyEvent; 
import org.eclipse.swt.events.ModifyListener; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.events.SelectionListener; 
import org.eclipse.swt.graphics.Rectangle; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Combo; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Table; 
import org.eclipse.swt.widgets.TableColumn; 
import org.eclipse.swt.widgets.TableItem; 

public class Test { 
private static Table table; 

public static void main(String[] args) { 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    table = new Table(shell, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION); 
    table.setHeaderVisible(true); 
    TableColumn column = new TableColumn(table, SWT.NONE); 
    column.setText("1"); 
    column.setWidth(70); 
    column = new TableColumn(table, SWT.NONE); 
    column.setText("2"); 
    column.setWidth(70); 
    column = new TableColumn(table, SWT.NONE); 
    column.setText("3"); 
    column.setWidth(70); 
    fillTable(); 
    Rectangle clientArea = shell.getClientArea(); 
    table.setBounds(clientArea.x, clientArea.y, 250, 300); 
    shell.setSize(400, 400); 
    Button button = new Button(shell, SWT.PUSH); 
    button.setBounds(10, 320, 150, 25); 
    button.setText("Reset Table"); 
    button.addSelectionListener(new SelectionListener(){ 

     @Override 
     public void widgetDefaultSelected(SelectionEvent e) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void widgetSelected(SelectionEvent e) { 
      resetTable(); 
     } 

    }); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

public static void addComboToCell(final int intgPEditCell) { 
    final TableEditor editor = new TableEditor(table); 
    // The editor must have the same size as the cell and must 
    // not be any smaller than 50 pixels. 
    editor.horizontalAlignment = SWT.LEFT; 
    editor.grabHorizontal = true; 
    editor.minimumWidth = 50; 
    // editing the second column 
    table.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
      // Clean up any previous editor control 
      Control oldEditor = editor.getEditor(); 
      if (oldEditor != null) 
       oldEditor.dispose(); 

      // Identify the selected row 
      TableItem item = (TableItem) e.item; 
      if (item == null) 
       return; 

      // The control that will be the editor must be a child of the 
      // Table 
      Combo newEditor = new Combo(table, SWT.NONE); 
      // SWT.NONE); 
      newEditor.setText(item.getText(intgPEditCell)); 
      newEditor.addModifyListener(new ModifyListener() { 
       public void modifyText(ModifyEvent me) { 
        Combo combo = (Combo) editor.getEditor(); 
        editor.getItem() 
          .setText(intgPEditCell, combo.getText()); 
       } 
      }); 
      newEditor.setFocus(); 
      editor.setEditor(newEditor, item, intgPEditCell); 
     } 
    }); 
} 

public static void resetTable(){ 
    TableItem[] tableItems = table.getItems(); 
    for (int i = 0; i < tableItems.length; i++) { 
     tableItems[i].dispose(); 
    } 
    Control[] children = table.getChildren(); 
    for (int i = 0 ; i < children.length; i++) { 
     children[i].dispose(); 
    } 
    table.removeAll(); 
    fillTable(); 
} 

public static void fillTable(){ 
    for (int i = 0; i < 50; i++) { 
     TableItem item = new TableItem(table, 0); 
     item.setText(0, "0 Item " + i); 
     item.setText(1, "1 Item " + i); 
     item.setText(2, "2 Item " + i); 
     addComboToCell(0); 
    } 
} 
} 

Так что мой вопрос, как я могу улучшить производительность после пополнения счета за столом ?! Я что-то забыл или что-то не так? Thanks

ответ

1

Снижение производительности вызвано добавлением TableEditor. В каждой строке есть одна, и все они слушают события выбора таблицы. Следовательно, если элемент выбран, активируются 50 TableEditor s, уложенные друг на друга. Чтобы добавить к этому, TableEditor не удаляются в resetTable, так что каждый выбор кнопки сброса добавляет еще 50.

Conecpt of TableEditors в SWT должен иметь один редактор для каждого столбца или типа редактора. В соответствующем случае редактор перемещается в нужное место, инициализируется правильными значениями, а затем отображается.

В вашем случае вызов addComboToCell (0) необходимо переместить в метод main, где-то после создания таблицы.

+0

Большое вам спасибо. Я искал это последние три дня и не получил ответа. Теперь он отлично работает! – Winusch

Смежные вопросы