Windows 7 SWT COMBO Проблема - PullRequest
0 голосов
/ 30 июля 2011

У меня возникла проблема с SWT Combo в моем приложении RCP Eclipse.

Я попытаюсь объяснить мою проблему с помощью варианта использования для лучшего понимания.

  1. У меня есть поле со списком в Eclipse RCP View со значениями «A», «B», «C», «D», а у меня есть кнопка «Отправить» и таблица SWT прямо под ним.

  2. После изменения значения в поле со списком и нажатия кнопки отправки записи будут отображаться в таблице.

  3. Предположим, что «A» выбрано по умолчанию, и записи A отображаются в таблице при вызове представления.

  4. Теперь я выбираю «B» из выпадающего списка и нажимаю «Отправить». Я вижу только записи "A" в таблице, хотя комбо показывает "B".

  5. ТОЛЬКО если я снова выберу «B» из комбинированного списка и затем нажму «отправить», отобразятся записи «B».

  6. Теперь, если я выберу C из комбо, отображаются только записи "B".

  7. Позже, если я выберу D из комбинированного списка, отобразятся записи "C".

Похоже, что обрабатываются и отображаются только предыдущие выборки, а не текущий выбор.

Я не сталкиваюсь с этой проблемой в Windows XP или предыдущих версиях Windows. Недавно я перешел на 64-разрядную ОС Windows 7, где я столкнулся с этой проблемой.

Это известная проблема? Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Вы используете выпадающий прослушиватель для сохранения выбранного индекса.Прослушивающий слушатель срабатывает, когда выпадающий список выпадает.В это время сохраняется выбор old .Если вы выберете новый элемент в списке, слушатель больше не будет запущен.Хотя вы всегда получаете предыдущий выбранный индекс предмета, если позже нажимаете кнопку отправки.

Чтобы получить то, что вы хотите, вы должны использовать выбор слушателя вместо раскрывающегося слушателя и всеработает отлично.Слушатель выбора вызывается при выборе элемента в раскрывающемся списке.Просто замените SWT.DropDown на SWT.Selection.

filter.addListener(SWT.Selection, new Listener() {...});
0 голосов
/ 04 августа 2011


Ниже приведен пример кода

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class TestCombo {


    private static String[] filterByText = new String[] {"A","B","C","D"};
    static int index = 0;

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);


        Composite comp =  new Composite(shell, SWT.NONE);

        GridLayout layout = new  GridLayout(2, false);
        GridData gridData = new GridData(SWT.FILL,SWT.FILL,true,false);

        comp.setLayout(layout);
        comp.setLayoutData(gridData);

        final Combo filter = new Combo (comp, SWT.READ_ONLY);
        filter.setItems (filterByText );
        filter.setText (filterByText[0]);
        filter.setVisibleItemCount( filterByText.length );

        filter.addListener(SWT.DROP_DOWN, new Listener() {

            @Override
            public void handleEvent(Event event) {
                index = filter.getSelectionIndex();

            }
        });

        Button submit = new Button (comp, SWT.PUSH);
        submit.setText ("Submit");
        GridData data = new GridData();
        data.widthHint = 80;
        submit.setLayoutData(data);
        submit.addSelectionListener (new SelectionAdapter () {
            public void widgetSelected(SelectionEvent e) {

                System.out.println("The index is ==> "+index);
            }
        });
        comp.pack();
        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

}
...