Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在单击输入数字按钮时保持对JTextField的关注?_Java_Swing_Jtextfield_Jtextarea - Fatal编程技术网

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

Java 如何在单击输入数字按钮时保持对JTextField的关注?,java,swing,jtextfield,jtextarea,Java,Swing,Jtextfield,Jtextarea,我是GUI新手,遇到了以下问题。我有3个JText字段,信用卡号,到期日期和安全号码。我能够在字段中输入信息。我还为每个按钮实现了焦点侦听器。如果我点击它,它表示获得了焦点,如果我点击其他任何地方,它就会失去焦点。在这些文本字段下,我有一个数字键盘(触摸屏/鼠标单击)来输入数字。如何将焦点放在该特定文本字段上,直到只单击另外两个文本字段中的一个?一旦我尝试单击输入数字,当前具有焦点的文本字段将失去焦点。我不想发生这种事。我在网上搜索,找不到与我的案件相关的东西。任何帮助或提示都将不胜感激 myJ

我是GUI新手,遇到了以下问题。我有3个JText字段,信用卡号,到期日期和安全号码。我能够在字段中输入信息。我还为每个按钮实现了焦点侦听器。如果我点击它,它表示获得了焦点,如果我点击其他任何地方,它就会失去焦点。在这些文本字段下,我有一个数字键盘(触摸屏/鼠标单击)来输入数字。如何将焦点放在该特定文本字段上,直到只单击另外两个文本字段中的一个?一旦我尝试单击输入数字,当前具有焦点的文本字段将失去焦点。我不想发生这种事。我在网上搜索,找不到与我的案件相关的东西。任何帮助或提示都将不胜感激

myJButton.setFocusable(false);
或者如果在
allMyButtons
集合中有一组按钮:

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

就是这样。

除了@Hovercrafts suggestion(+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();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.text.*;
公共类NumpadPanel扩展了JPanel
{
公共NumpadPanel()
{
setLayout(新的BorderLayout());
JTextField textField1=新的JTextField(4);
JTextField textField2=新的JTextField(2);
JTextField textField3=新的JTextField(2);
JPanel面板=新的JPanel();
panel.add(textField1);
panel.add(textField2);
panel.add(textField3);
添加(面板、边框布局、页面开始);
Action numberAction=新文本Action(“”)
{
@凌驾
已执行的公共无效操作(操作事件e)
{
JTextComponent textComponent=getFocusedComponent();
if(textComponent!=null)
textComponent.replaceSelection(例如getActionCommand());
}
};
JPanel buttonPanel=新的JPanel();
setLayout(新的GridLayout(0,5));
添加(按钮面板、边框布局、中心);
对于(int i=0;i<10;i++)
{
String text=String.valueOf(i);
JButton按钮=新JButton(文本);
addActionListener(numberAction);
按钮设置边距(新插图(20,20,20,20));
按钮。设置可聚焦(假);
按钮面板。添加(按钮);
}
//文本字段已满时可选择自动选项卡
//SizeDocumentFilter sf=新的SizeDocumentFilter();
//sf.installFilter(文本字段1、文本字段2、文本字段3);
}
私有静态void createAndShowUI()
{
JFrame=新JFrame(“Numpad面板”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新的NumpadPanel());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
createAndShowUI();
}
});
}
}

您可能还想考虑当文本字段满时,使用从文本字段到文本字段的SO焦点移动。

啊。现在我可以在网上找到很多东西。我会尝试一下,稍后再给你回复。谢谢,用这个就可以了。非常感谢。我将所有数字按钮设置为false,并根据关注的内容在true和false之间交替设置文本字段。“为什么会发生这种情况?”我为您提供了工作代码。你的代码有什么不同?发布一个演示问题的帖子。感谢您的回复,但是我无法扩展TextAction类,因为我已经扩展了另一个类。我要处理的代码太多了。但我最终还是让它和气垫船答案一起工作了。@Harold,是的,气垫船答案解决了你的问题。TextAction提供了更好的设计<代码>我已经扩展了一个不同的类,什么不同的类?没有理由像我演示的那样创建一个简单的类。这个类独立于您可能已经创建的任何类工作。我想时间是原因。我们设计了一个POS系统,我负责sql/数据库的工作。GUI团队有太多的工作要处理,所以我决定尝试帮助他们。我迷路了,不知道从哪里开始。这是一次很好的学习经历。我们的项目已完成,但我将尝试修改代码以扩展TextAction。