如何在Java中找到焦点的JTextField?

时间:2016-04-06 01:04:28

标签: java swing focus jtextfield

在我的Java Swing应用程序中,我有多个JTextFields用于日期,点击时有一个JButton,它会打开一个日历来选择一个日期,并且日期字符串应该插入其中一个JTextFields中,所以我想要设计程序,以便用户首先点击日期JTextField他想输入日期[获得焦点并记住它],程序将JTextField保存为目标组件,然后将该组件传递给日历对象以输入选择日期。到目前为止,我可以硬编码程序,以便它可以输入我选择的任何日期字符串到我硬编码的某个JTextField,但问题是如何记住点击的JTextField用户?所以我不必硬编码。

我试过了:Date_Field.getDocument()。addDocumentListener(A_Listener); 在用户开始输入之前,它不会得到关注。

我也试过了:

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

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

那么当用户只是点击它而不输入任何内容时,有什么方法可以获得JTextField?

enter image description here

3 个答案:

答案 0 :(得分:3)

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);
            }
        });
    }

}

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

答案 1 :(得分:3)

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

  

如何在Java中找到焦点的JTextField?

但是,要在处理文本组件时回答上面的一般性问题,您可以创建一个Action,其范围为TextActionTextAction具有getFocusedComponent()方法,该方法返回具有焦点的最后一个文本组件。

例如:

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

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

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

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

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

答案 2 :(得分:1)

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

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());
  }
}); 

然后我将Focused_Date_TextField传递给日历,因此当选择日期时,日期文本将输入到用户选择的JTextField中。