How to be notified that a composite's child received/lost focus?

前端 未结 2 1062
青春惊慌失措
青春惊慌失措 2021-01-21 09:25

I have an SWT Composite that I need to pass to some other code which will add children to it at will. Is there any way to be notified that a child of the composite

2条回答
  •  没有蜡笔的小新
    2021-01-21 09:57

    Have you checked this link: SWT: notify a composite that it has a new child

    As per the proposed solution in the above link the only possible solution is to use the resize event. Based on that see the following code, which adds a focus listener on all the immediate child nodes. Though the solution itself is not very elegant.

    Test Code

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.ControlEvent;
    import org.eclipse.swt.events.ControlListener;
    import org.eclipse.swt.events.FocusEvent;
    import org.eclipse.swt.events.FocusListener;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Control;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    
    public class SWTApplication 
    {
        public static void main(String[] args) {
            new SWTApplication().initSystem("Children Notification");
        }
    
        private Display display;
        private Shell shell;
    
        public void initSystem(String windowName)
        {
            display = new Display();
            shell = new Shell(display);
            shell.setText(windowName);
            shell.setLayout(new GridLayout(6, true));
            shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    
            final TestFocusListener listener = new TestFocusListener();
    
            shell.addControlListener(new ControlListener() {
                public void controlResized(ControlEvent e) {
                    if(e.getSource() instanceof Shell)
                    {
                        Shell s = (Shell)e.getSource();
                        Control[] children = s.getChildren();
                        for (int i = 0; i < children.length; i++) 
                        {
                            Control c = children[i];
                            c.removeFocusListener(listener);
                            c.addFocusListener(listener);
                        }
                    }
                }
                public void controlMoved(ControlEvent e) {
                }
            });
    
    
            createControls();
    
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
    
            display.dispose();
        }
    
        private void createControls() 
        {
            String[] name = {"a", "b", "c", "d", "e", "f"};
            for(int i=0; i<6; i++)
            {
                Button button = new Button(shell, SWT.PUSH);
                button.setText(name[i] + " button");
                button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
                shell.setSize(shell.computeSize(SWT.DEFAULT, SWT.DEFAULT));
            }
        }
    
        class TestFocusListener implements FocusListener
        {
            public void focusGained(FocusEvent e) {
                Object src = e.getSource();
                if(src instanceof Button)
                {
                    System.out.println("Focus gained: " + ((Button)src).getText());
                }
    
            }
            public void focusLost(FocusEvent e) {
                Object src = e.getSource();
                if(src instanceof Button)
                {
                    System.out.println("Focus lost: " + ((Button)src).getText());
                }
            }
        }
    
    }
    

提交回复
热议问题