How to request focus synchronously in Swing?

前端 未结 1 805
萌比男神i
萌比男神i 2020-12-11 21:50

When I call component.requestFocusInWindow(), Swing enqueues asynchronous FOCUS_GAINED and FOCUS_LOST events rather than synchronously

相关标签:
1条回答
  • 2020-12-11 22:30

    yes, Focus is pretty asynchronous, then should be wrapped int invokeLater, no way

    EDIT

    and nice workaround by @camickr

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    //http://www.coderanch.com/t/342205/GUI/java/Tab-order-swing-components
    public class Testing {
    
        private static final long serialVersionUID = 1L;
        private Component[] focusList;
        private int focusNumber = 0;
        private JFrame frame;
    
        public Testing() {
            JTextField tf1 = new JTextField(5);
            JTextField tf2 = new JTextField(5);
            JTextField tf3 = new JTextField(5);
            JButton b1 = new JButton("B1");
            JButton b2 = new JButton("B2");
            tf2.setEnabled(false);
            focusList = new Component[]{tf1, b1, tf2, b2, tf3};
            JPanel panel = new JPanel(new GridLayout(5, 1));
            panel.add(tf1);
            panel.add(b1);
            panel.add(tf2);
            panel.add(b2);
            panel.add(tf3);
            frame = new JFrame();
            frame.setFocusTraversalPolicy(new MyFocusTraversalPolicy());
            frame.add(panel);
            frame.pack();
            frame.setLocation(150, 100);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
    
                public boolean dispatchKeyEvent(KeyEvent ke) {
                    if (ke.getID() == KeyEvent.KEY_PRESSED) {
                        if (ke.getKeyCode() == KeyEvent.VK_TAB) {
                            Component comp = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
                            if (comp.isEnabled() == false) {
                                if (ke.isShiftDown()) {
                                    KeyboardFocusManager.getCurrentKeyboardFocusManager().focusPreviousComponent();
                                } else {
                                    KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
                                }
                            }
                        }
                    }
                    return false;
                }
            });
        }
    
        private class MyFocusTraversalPolicy extends FocusTraversalPolicy {
    
            public Component getComponentAfter(Container focusCycleRoot, Component aComponent) {
                focusNumber = (focusNumber + 1) % focusList.length;
                return focusList[focusNumber];
            }
    
            public Component getComponentBefore(Container focusCycleRoot, Component aComponent) {
                focusNumber = (focusList.length + focusNumber - 1) % focusList.length;
                return focusList[focusNumber];
            }
    
            public Component getDefaultComponent(Container focusCycleRoot) {
                return focusList[0];
            }
    
            public Component getLastComponent(Container focusCycleRoot) {
                return focusList[focusList.length - 1];
            }
    
            public Component getFirstComponent(Container focusCycleRoot) {
                return focusList[0];
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    Testing testing = new Testing();
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题