【问题标题】:How to move one field to another field using tab key using swing?如何使用swing使用tab键将一个字段移动到另一个字段?
【发布时间】:2012-09-26 12:27:14
【问题描述】:

我正在创建一个扩展JPanel 的类。我使用GridBagConstraints 在该面板中添加了几个文本区域和下拉菜单。现在我想使用键盘的 tab 键将一个字段移动到另一个字段。我还想提一下,以前的 tab 键是扩展 textareas 的。

这就是我写这行代码的原因:restuarantLocation.setTabSize(0); 现在它停止了扩展。

但我不知道如何使制表键工作?请帮忙。

【问题讨论】:

  • 澄清:您想使用 TAB 键从一个组件移动到另一个组件吗?
  • 如果您想“禁用”JTextArea 中 TAB 键的默认行为,您可以查看 this post

标签: java swing jpanel jcomponent gridbaglayout


【解决方案1】:

当您在任何文本区域内按 TAB 时 - 它会创建制表符。因此,您的代码 setTabSize(0) 并不能解决任何问题 - 它只是将制表宽度设置为零。

如果您只是在寻找焦点更改热键 - Ctrl+TAB 将代替任何 Swing 文本组件中的简单 TAB 工作,并将焦点切换到下一个可用且可聚焦的组件。 Ctrl+Shift+TAB 将焦点切换到上一个可用且可聚焦的组件。

如果您希望 TAB 以与其他 Swing 组件相同的方式运行 - 您可以添加自定义 TAB 操作:

public static void main ( String[] args )
{
    SwingUtilities.invokeLater ( new Runnable ()
    {
        public void run ()
        {
            JFrame frame = new JFrame ();

            frame.setLayout ( new GridLayout ( 1, 2 ) );

            AbstractAction transferFocus = new AbstractAction ()
            {
                public void actionPerformed ( ActionEvent e )
                {
                    ( ( Component ) e.getSource () ).transferFocus ();
                }
            };

            JTextArea textArea1 = new JTextArea ();
            textArea1.getInputMap ().put ( KeyStroke.getKeyStroke ( "TAB" ), "transferFocus" );
            textArea1.getActionMap ().put ( "transferFocus", transferFocus );
            frame.add ( new JScrollPane ( textArea1 ) );

            JTextArea textArea2 = new JTextArea ();
            textArea2.getInputMap ().put ( KeyStroke.getKeyStroke ( "TAB" ), "transferFocus" );
            textArea2.getActionMap ().put ( "transferFocus", transferFocus );
            frame.add ( new JScrollPane ( textArea2 ) );

            frame.setSize ( 500, 200 );
            frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
            frame.setLocationRelativeTo ( null );
            frame.setVisible ( true );
        }
    } );
}

请注意,您必须:

  1. 在输入映射中首先将默认选项卡 KeyStroke 替换为您的操作名称
  2. 将您的自定义操作添加到组件操作映射中

【讨论】:

  • 非常感谢。我可以用 jpanel 代替 jframe 吗?
  • @user1568579 在哪里添加文本区域并不重要
【解决方案2】:

如果内置的制表符不起作用,您可能需要查看有关焦点遍历的 Java 教程。

http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html

【讨论】:

  • 谢谢你。但我需要解决方案。我对摇摆的想法很少。但仍然thnks。我正在浏览链接。:)
  • @user1568579 我需要一个解决方案 我们需要一个更清晰的问题,展示一个非工作代码的具体示例。发布SSCCE,答案将如雨后春笋般涌现。
  • @user1568579 和此评论后please to read StackOverflow FQA
【解决方案3】:

使用这个例子:

Vector vector=new Vector(3);
vector.Add(textBox1);
vector.Add(textBox2);
vector.Add(textBox3);
clsTabOrder newPolicy=new clsTabOrder(vector);
setFocusTraversalPolicy(newPolicy);
textBox1.requestFocus();

【讨论】:

【解决方案4】:
 jTextField1.setNextFocusableComponent(jTextField2);
    jTextField2.setNextFocusableComponent(jTextField3);
    jTextField3.setNextFocusableComponent(jTextField4);
    jTextField4.setNextFocusableComponent(jTextField5);

当你不显示 jframe 点击时自动点击 jtextfild

 this.jTextField11.requestFocusInWindow();

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多