如何使用 swing 使用 Tab 键将一个字段移动到另一字段?

use*_*579 1 java swing jcomponent jpanel gridbaglayout

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

这就是为什么我写下这句话:restuarantLocation.setTabSize(0);现在它停止了扩张。

但我不知道如何让 tab 键起作用?请帮忙。

Mik*_*rin 5

当您在任何文本区域内按 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 );
        }
    } );
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须:

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