首页 文章

如何在单击输入数字按钮时将焦点保持在JTextField上?

提问于
浏览
2

我是GUI的新手,我遇到以下问题 . 我有3个JTextFields,信用卡号,到期日期和安全号码 . 我可以在字段中输入信息 . 我还为每个按钮实现了焦点监听器 . 如果我点击它,它表示获得了焦点,如果我点击其他地方,它会失去焦点 . 在这些文本字段下,我有一个数字键盘(触摸屏/鼠标点击)输入数字 . 如何仅关注该特定文本字段,直到仅显示其他两个文本字段中的一个?一旦我尝试点击输入数字,当前具有焦点的文本字段将失去焦点 . 我不希望这种情况发生 . 我在网上搜索过,无法找到特定于我案例的内容 . 任何帮助或提示将不胜感激 .

2 回答

  • 3
    myJButton.setFocusable(false);
    

    或者如果 allMyButtons 集合中有一堆按钮:

    for (JButton button: allMyButtons) {
        button.setFocusable(false);
    }
    

    而已 .

  • 6

    除了@Hovercrafts建议(1)之外,您可能希望扩展 TextAction 以便将数字插入文本字段 . TextAction 允许您访问具有焦点的最后一个文本字段,因此插入代码变得非常通用:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.text.*;
    
    public class NumpadPanel extends JPanel
    {
        public NumpadPanel()
        {
            setLayout( new BorderLayout() );
    
            JTextField textField1 = new JTextField(4);
            JTextField textField2 = new JTextField(2);
            JTextField textField3 = new JTextField(2);
    
            JPanel panel = new JPanel();
            panel.add( textField1 );
            panel.add( textField2 );
            panel.add( textField3 );
            add(panel, BorderLayout.PAGE_START);
    
            Action numberAction = new TextAction("")
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    JTextComponent textComponent = getFocusedComponent();
    
                    if (textComponent != null)
                        textComponent.replaceSelection(e.getActionCommand());
                }
            };
    
            JPanel buttonPanel = new JPanel();
            buttonPanel.setLayout( new GridLayout(0, 5) );
            add(buttonPanel, BorderLayout.CENTER);
    
            for (int i = 0; i < 10; i++)
            {
                String text = String.valueOf(i);
                JButton button = new JButton( text );
                button.addActionListener( numberAction );
                button.setMargin( new Insets(20, 20, 20, 20) );
                button.setFocusable( false );
                buttonPanel.add( button );
            }
    
            // Optionally auto tab when text field is full
    
            //SizeDocumentFilter sf = new SizeDocumentFilter();
            //sf.installFilter(textField1, textField2, textField3);
        }
    
        private static void createAndShowUI()
        {
            JFrame frame = new JFrame("Numpad Panel");
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            frame.add( new NumpadPanel() );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible(true);
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    

    您可能还需要考虑使用Text Field Auto Tab,以便在文本字段变满时将焦点从文本字段移动到文本字段 .

相关问题