| Summary: | Combo listener behavior is not consistent across platforms | ||
|---|---|---|---|
| Product: | [Eclipse Project] Platform | Reporter: | Greg Watson <g.watson> |
| Component: | SWT | Assignee: | Platform-SWT-Inbox <platform-swt-inbox> |
| Status: | RESOLVED WONTFIX | QA Contact: | |
| Severity: | normal | ||
| Priority: | P3 | CC: | cmnavarr, eclipse.felipe |
| Version: | 3.7 | ||
| Target Milestone: | --- | ||
| Hardware: | All | ||
| OS: | All | ||
| Whiteboard: | |||
| Bug Depends on: | |||
| Bug Blocks: | 368754 | ||
Could someone take a look at this and at least let us know if this is a known problem, or a bug and we should be looking for a workaround? Thanks! modify events in the combobox are a bit of a problem, what are you trying to do ? Maybe you could be using SWT.Selection event instead ? SWT.Selection appears to have fixed our problem. Thanks! |
We see different behavior for combo listeners on different platforms. Is this expected? The issue is shown in the following example. On Mac/Windows, clicking on the Update button results in: update combo modify event On Linux, the same code produces: update combo modify event modify event modify event fire event that should not happen! It seems that on Linux there is an extra event generated by the system after the button listener has finished. Are we doing something wrong? If a bug, can you suggest a workaround? Thanks! ---------------------------- import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; 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 ComboEventTest { private static Combo combo; private static boolean initializing = false; private static String[] languages = new String[] { "Java" }; public ComboEventTest() { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new GridLayout(2, true)); combo = new Combo(shell, SWT.READ_ONLY | SWT.DROP_DOWN); for (int i = 0; i < languages.length; i++) { combo.add(languages[i]); combo.setData(Integer.toString(i), languages[i]); } combo.select(0); combo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { System.out.println("modify event"); if (!initializing) { System.out.println("fire event that should not happen!"); } } }); Button b = new Button(shell, SWT.PUSH); b.setText("Update"); b.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { updateComboSelection(); } }); shell.pack(); shell.open(); // Set up the event loop. while (!shell.isDisposed()) { if (!display.readAndDispatch()) { // If no more entries in event queue display.sleep(); } } display.dispose(); } private static void updateComboSelection() { initializing = true; System.out.println("update combo"); combo.removeAll(); for (int i = 0; i < languages.length; i++) { combo.add(languages[i]); combo.setData(Integer.toString(i), languages[i]); } combo.select(0); combo.getParent().layout(true); initializing = false; } /** * @param args */ public static void main(String[] args) { new ComboEventTest(); } }