当前位置: 首页 > 知识库问答 >
问题:

如何在Java中找到JTextField焦点?

方和豫
2023-03-14

在我的Java Swing应用程序中,我有多个用于日期的JTextField,单击时会有一个JButton,它会打开日历来选择日期,并且日期字符串应该插入其中一个JTextField,所以我想设计程序,让用户先点击一个日期JTextField,他想输入一个日期[关注该字段并记住它],程序将JTextField保存为目标组件,然后将该组件传递给calendar对象以输入拾取的日期。到目前为止,我可以对程序进行硬编码,这样它就可以将我选择的任何日期字符串输入到我硬编码过的某个JTextField,但问题是如何记住用户点击的JTextField?所以我不需要硬编码。

我试过:Date_Field.get文档()。addDocumentListener(A_Listener);直到用户开始输入它,它才会得到焦点。

我也试过:

Date_Field.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
     Focused_Date_TextField=(JTextField)evt.getSource();
  }
});

也不起作用,因为当用户点击它时,在用户开始输入之前,还没有任何动作[因此没有焦点]。

那么,当用户只需单击JTextField而不键入任何内容时,有什么方法可以获取它呢?

共有3个答案

薛淳
2023-03-14

谢谢你的回答和建议,但它们不是我想要找到的。太麻烦了,我的应用程序中没有足够的空间为每个字段添加一个按钮,即使我有足够的空间,他们看起来太忙了,几十个字段都有自己的按钮,我想清理简单的外观,但仍然以我喜欢的方式运行,所以我做了一些搜索,找到了理想的答案,下面是如何实现它:

Date_TextField[Index].addFocusListener(new FocusListener()
{
  public void focusGained(FocusEvent e)
  {
    Out("Focus gained : "+e.toString());
    Focused_Date_TextField=(JTextField)e.getSource();
  }

  public void focusLost(FocusEvent e)
  {
    Out("Focus lost : "+e.toString());
  }
}); 

然后,我将焦点_Date_TextField传递给日历,这样在选择日期时,日期文本将被输入到用户选择的JTextField中。

通博实
2023-03-14

程序员的建议是解决问题的方法。这是您将在其他应用程序中看到的常见UI。

如何在Java中找到JTextField焦点?

不过,在处理文本组件时,要回答上述更一般的问题,可以创建一个扩展自TextActionActionTextAction有一个getFocusedComponent()方法,它返回最后一个带焦点的文本组件。

例如:

public class SelectAll extends TextAction
{
    public SelectAll()
    {
        super("Select All");
    }

    public void actionPerformed(ActionEvent e)
    {
        JTextComponent component = getFocusedComponent();
        component.selectAll();
        component.requestFocusInWindow();
    }
}

因此,通常您会使用此类创建JMenuItem,然后将菜单项添加到JMenuBar上的JMenu。这实际上是JDK的剪切/复制/粘贴操作的工作方式。

同样,我不建议将其作为解决此问题的解决方案,但建议用于将来在多个文本组件之间共享操作时出现的问题。

此外,当您使用这种方法时,getFocus usedComponent()方法将返回任何文本组件,因此不能保证最后一个具有焦点的组件将是您的日期字段之一。不使用这种方法的另一个原因。

孙恩
2023-03-14

JTextFieldJButton合并成一个自定义组件(可能是一个JPanel),并隔离其中的功能。这样,按钮总是与给定的JTextField相关联,并且您不关心哪个字段最后被“聚焦”

public class DateField extends JPanel {
    private JTextField field;
    private JButton btn;

    public DateField() {
        setLayout(new FlowLayout(FlowLayout.LEFT));

        field = new JTextField(11);
        btn = new JButton("...");

        add(field);
        add(btn);

        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // Show calendar, get date do all that funky stuff
                field.setText(dateAsString);
            }
        });
    }

}

然后,您可以创建任意数量的容器,并将它们添加到您想要的任何容器中

 类似资料:
  • 问题内容: 我让我的游戏在没有鼠标的情况下运行,因此不能使用指针。当玩家输球时将显示高分菜单。 这是我的代码 我努力了 但仍然没有专注于我的。 如何聚焦呢? 问题答案: 如果希望在GUI显示时集中精力,可以使用以下方法: 哪里会是你和你的。

  • 当我的应用程序加载时,它是使用netbean制作的,第一个JTextField会自动聚焦,在这个JTextField中,我写了“输入您的用户名”,当用户点击这个字段时它会消失,但是当应用程序加载时,这个字段是聚焦的,意味着我看不到“输入您的用户名”,如何在启动时取消聚焦?

  • 问题内容: 我想将焦点放在作为对象消息传递给JOptionPane的特定JTextField上。这是我的代码(我希望焦点在txt2上,但焦点始终在txt1上): 问题答案: 一旦覆盖,您可以让组件请求焦点。像这样: 这是程序的完整功能/经过测试的版本:

  • 问题内容: 我们如何从文本字段中检索值?我需要将值转换为进一步处理。我已经在单击按钮时创建了一个文本字段,我需要存储输入到中的值,你能提供一个代码段吗? 问题答案: 参见Java文档中的JTextField 示例代码可以是:

  • 所以,我完成了一个数独解算器,但我想改进它。要做到这一点,我需要从中找到我的。我正在使用实时读取我的,问题是在中。 我需要到达发生的。例如,如果输入无效,将变红等。 如果您需要知道,我将所有放在矩阵中。每个字段都处理数独中的一个数字。 (扩展)

  • 问题内容: 我试图在单个行上具有多个JTextField,但是我不希望它们具有相同的宽度。如何控制宽度并使其中一些比其他更宽?我希望它们一起占总宽度的100%,所以如果我可以使用某种重量的东西,那将是很好的。 我试过了,但是没有道理。 这是一个示例,其中我使用了三行和三个字符串,这些字符串应按列显示: 问题答案: 所有Swing组件均具有首选大小。文本组件的首选大小基于组件的文本。因此,一般情况下