单击输入数字按钮时如何保持对 JTextField 的关注?

How to keep Focus on JTextField while clicking input number buttons?

我是 GUI 方面的新手,遇到以下问题。我有 3 个 JTextFields、信用卡号、有效期和安全号码。我能够在字段中输入信息。我还为每个按钮实现了焦点侦听器。如果我点击它,它会说获得焦点,如果我点击其他任何地方,它就会失去焦点。在这些文本字段下,我有一个数字键盘(触摸 screen/mouse 单击)来输入数字。我如何保持专注于该特定文本字段,直到仅且具体地单击其他两个文本字段之一?一旦我尝试单击输入数字,当前具有焦点的文本字段将失去焦点。我不希望这发生。我在网上搜索,但找不到适合我的情况的内容。如有任何帮助或提示,我们将不胜感激。

myJButton.setFocusable(false);

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

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

就是这样。

除了@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,以便在文本字段变满时焦点从文本字段移动到文本字段。