java 按 Enter 键切换 JTextFields

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14902410/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 17:47:23  来源:igfitidea点击:

switching JTextFields by pressing Enter key

javaswingfocusjtextfield

提问by Gil Peretz

I have created number of text fields and I'm wonder how can I switch the focus between the fields by pressing the enter key.

我创建了多个文本字段,我想知道如何通过按 Enter 键在字段之间切换焦点。

In addition, Can I control the Target field ? for example can I defined that by pressing Enterin field Athe focus will be change to field C?

另外,我可以控制目标字段吗?例如,我可以定义通过按压Enterfield A重点将是变化field C

enter image description here

在此处输入图片说明

回答by Maroun

Simple example:

简单的例子:

Suppose you have two JTextFields: textFieldand textField1

假设你有两个JTextFields:textFieldtextField1

textField.addActionListener(new ActionListener() {
   @Override
    public void actionPerformed(ActionEvent e) {
      textField1.requestFocusInWindow();    
    }
}); 

textField1.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
      textField.requestFocusInWindow(); 
   }
}); 

Now when you hit Enterwhen focused on the first JTextField, the other one will be focused, and vice versa.

现在当你Enter专注于第一个时击中JTextField,另一个将专注,反之亦然。

回答by MadProgrammer

Take a look at How to Use the Focus Subsystem

看看如何使用焦点子系统

It will explains how to set the transfer keys for the focus sub system

它将解释如何为焦点子系统设置传输键

Simple example

简单的例子

public class TestFocusTransfersal {

    public static void main(String[] args) {
        new TestFocusTransfersal();
    }

    public TestFocusTransfersal() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField field1 = new JTextField("1", 10);
        private JTextField field2 = new JTextField("2", 10);
        private JTextField field3 = new JTextField("3", 10);
        private JTextField field4 = new JTextField("4", 10);
        private JTextField field5 = new JTextField("5", 10);
        private JTextField field6 = new JTextField("6", 10);
        private JTextField field7 = new JTextField("7", 10);
        private JTextField field8 = new JTextField("8", 10);
        private JTextField field9 = new JTextField("9", 10);
        private final MyOwnFocusTraversalPolicy policy;

        public TestPane() {
            // Set up enter for focus transfer...
            Set forwardKeys = getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
            Set newForwardKeys = new HashSet(forwardKeys);
            newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
            setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
                            newForwardKeys);

            setLayout(new GridBagLayout());

            add("Field #1: ", field1, 0, 0);
            add("Field #2: ", field2, 2, 0);
            add("Field #3: ", field3, 4, 0);
            add("Field #4: ", field4, 6, 0);
            add("Field #5: ", field5, 8, 0);
            add("Field #6: ", field6, 2, 1);
            add("Field #7: ", field7, 4, 1);
            add("Field #8: ", field8, 6, 1);
            add("Field #9: ", field9, 8, 1);

            policy = new MyOwnFocusTraversalPolicy(
                            field1,
                            field6,
                            field7,
                            field8,
                            field9,
                            field2,
                            field3,
                            field4,
                            field5
                            );

//            You can do this to make life easier, but it may have unexpected
//            consequences...
//            setFocusCycleRoot(true);
//            setFocusTraversalPolicy(policy);

        }

        @Override
        public void addNotify() {
            super.addNotify(); 
//        Comment this out if you use focusCycleRoot
            SwingUtilities.getWindowAncestor(this).setFocusTraversalPolicy(policy);
        }

        protected void add(String label, JTextField field, int x, int y) {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridy = y;
            gbc.gridx = x;
            gbc.insets = new Insets(2, 2, 2, 2);
            gbc.anchor = GridBagConstraints.EAST;
            add(new JLabel(label), gbc);
            gbc.gridx++;
            add(field, gbc);
        }
    }

    public static class MyOwnFocusTraversalPolicy
                    extends FocusTraversalPolicy {

        private List<Component> order;

        public MyOwnFocusTraversalPolicy(Component... order) {
            this.order = new ArrayList<>(Arrays.asList(order));
        }

        @Override
        public Component getComponentAfter(Container focusCycleRoot,
                        Component aComponent) {
            int idx = (order.indexOf(aComponent) + 1) % order.size();
            return order.get(idx);
        }

        @Override
        public Component getComponentBefore(Container focusCycleRoot,
                        Component aComponent) {
            int idx = order.indexOf(aComponent) - 1;
            if (idx < 0) {
                idx = order.size() - 1;
            }
            return order.get(idx);
        }

        @Override
        public Component getDefaultComponent(Container focusCycleRoot) {
            return order.get(0);
        }

        @Override
        public Component getLastComponent(Container focusCycleRoot) {
            return order.size() > 0 ? order.get(order.size()) : null;
        }

        @Override
        public Component getFirstComponent(Container focusCycleRoot) {
            return order.get(0);
        }
    }
}