Windows 7 SWT COMBO问题

时间:2011-07-29 23:59:11

标签: swt eclipse-rcp

我在eclipse RCP应用程序中遇到了SWT Combo的问题。

我会尝试用一个用例来解释我的问题,以便更好地理解。

  1. 我在Eclipse RCP View中有一个组合框,其值为“A”,“B”,“C”,“D”,旁边有一个提交按钮&它下方的SWT表。

  2. 在Combo中更改值并单击提交按钮后,记录将显示在表格中。

  3. 我们假设默认情况下选择“A”,并且在视图调用的表格中显示A的记录。

  4. 现在我从下拉列表中选择“B”,然后点击“提交”。虽然组合显示“B”,但我只看到表中“A”的记录。

  5. 只有当我从组合中再次选择“B”然后点击提交时,才会显示“B”的记录。

  6. 现在,如果我从组合中选择C,则只会显示“B”的记录。

  7. 稍后,如果我从组合中选择D,则会显示“C”的记录。

  8. 似乎只处理和显示了之前的选择,而不是当前的选择。

    我在Windows XP或Windows的早期版本中没有遇到此问题。我最近转向使用Windows 7 64位操作系统,我遇到了这个问题。

    这是一个已知问题吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用下拉侦听器存储所选索引。当组合列表下降时,将触发下拉监听器。此时,存储选项。如果在列表中选择新项,则不会再次触发侦听器。如果您稍后按下提交按钮,则始终会获得之前选择的项目索引。

要获得您想要的内容,您必须使用选择侦听器而不是下拉侦听器,并且一切正常。在下拉列表中选择项目时,将调用选择侦听器。只需将SWT.DropDown替换为SWT.Selection即可。

filter.addListener(SWT.Selection, new Listener() {...});

答案 1 :(得分:0)


请在下面找到示例代码

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();
    }

}