在java中,使enter键像jtextfield、jcombobox、jspinner的tab键一样工作

在java中,使enter键像jtextfield、jcombobox、jspinner的tab键一样工作,java,swing,focus,key-bindings,Java,Swing,Focus,Key Bindings,我想让enter键在我的swing应用程序中表现得像tab键。这个类在JTextFields中工作得很好。我如何对JComboBox和Jspinner或框架上的其他控件执行相同的操作?请提供帮助 class MyTextField extends JTextField { MyTextField(int len) { super(len); addKeyListener(new KeyAdapter() { @Override publ

我想让enter键在我的swing应用程序中表现得像tab键。这个类在JTextFields中工作得很好。我如何对JComboBox和Jspinner或框架上的其他控件执行相同的操作?请提供帮助

class MyTextField extends JTextField {
    MyTextField(int len) {
    super(len);
    addKeyListener(new KeyAdapter() {
            @Override
      public void keyPressed(KeyEvent evt) {
        int key = evt.getKeyCode();
        if (key == KeyEvent.VK_ENTER)
          transferFocus();
      }
    });
  }
}
Enter对于Swing中的大多数组件都有特殊的含义,例如,按下Enter键时,
JTextField
将在注册的
ActionListeners
上触发
actionPerformed
。修改此行为可能会给您的应用程序带来意外的结果,并可能使许多用户感到困惑

话虽如此,更改焦点遍历键的最佳方法是向
KeyboardFocusManager
提供
Set
KeyStroke
s。这将(主要)使密钥具有全局性

然而,一些组件提供了自己的焦点遍历键,如
JTextArea
JTable

请查看以了解更多详细信息

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestFocusTraversal {

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

    public TestFocusTraversal() {
        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 {

        public TestPane() {
            setLayout(new GridBagLayout());
            for (int index = 0; index < 10; index++) {
                JTextField tf = new JTextField(5);
                tf.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("...");
                    }
                });
                add(tf);
            }

            add(new JScrollPane(new JTextArea(10, 10)));

            KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
            KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
            KeyStroke ctrlTab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK);
            Set<KeyStroke> keys = new HashSet<>();
            keys.add(enter);
            keys.add(tab);
            keys.add(ctrlTab);
            KeyboardFocusManager.getCurrentKeyboardFocusManager().setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, keys);
        }
    }

}
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入java.awt.KeyboardFocusManager;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.util.HashSet;
导入java.util.Set;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.JTextField;
导入javax.swing.KeyStroke;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestFocusTraversal{
公共静态void main(字符串[]args){
新的TestFocusTraversal();
}
公共TestFocusTraversal(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
对于(int-index=0;index<10;index++){
JTextField=新的JTextField(5);
tf.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
System.out.println(“…”);
}
});
添加(tf);
}
添加(新的JScrollPane(新的JTextArea(10,10));
击键输入=击键.getKeyStroke(KeyEvent.VK_enter,0);
击键选项卡=击键.getKeyStroke(KeyEvent.VK_选项卡,0);
击键ctrlTab=击键.getKeyStroke(KeyEvent.VK_选项卡,KeyEvent.CTRL_DOWN_掩码);
Set keys=new HashSet();
键。添加(输入);
键。添加(选项卡);
添加(ctrlTab);
KeyboardFocusManager.getCurrentKeyboardFocusManager().setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,KEYS);
}
}
}

Enter键对于不同的组件有不同的含义,删除此功能可能会降低程序对用户的可用性。然而,你会想看一看。使用
setFocusTraversalKeys
查找示例,则无法从JComboBox的弹出窗口中选择和项目,JSpinner中的编辑器可能会丢失InputMask???并且不会触发
ActionListener
…嘿,谢谢。我从客户端有这个要求。客户端希望使用Enter键而不是Tab键。是否有任何过程可以将焦点从一个控件(jtextfield、jcombobox、JSpinner)移动到另一个控件(jtextfield、jcombobox、JSpinner)使用Enter键?问题是,您更改了这些组件的预期行为,更不用说用户的预期了……“大多数”用户知道tab键是转移焦点键……但我们知道什么;)注意:未触发任何字段
ActionListener
s+1、@silent\u killer,
非常感谢……这确实是我想要实现的。
-那么你应该“接受”答案。这是找到答案后结束问题的标准方式。这是我的第一篇帖子,请纠正我的错误。谢谢你的回答。