Java 概括几个文本字段,以便在获得焦点时选择整个文本

Java 概括几个文本字段,以便在获得焦点时选择整个文本,java,swing,jtextfield,focuslistener,Java,Swing,Jtextfield,Focuslistener,我希望面板中的几个文本字段中的每个字段都有一个中心对齐,并且有一个焦点侦听器,当获得焦点时,该侦听器将选择整个字段 txtSelection = new JTextField("", 9); txtInclusion = new JTextField("", 9); txtExclusion = new JTextField("", 9); ... 我知道如何一个接一个地做: txtSelection.setHorizontalAlignment(JTextField.CENTER); tx

我希望面板中的几个文本字段中的每个字段都有一个中心对齐,并且有一个焦点侦听器,当获得焦点时,该侦听器将选择整个字段

txtSelection = new JTextField("", 9);
txtInclusion = new JTextField("", 9);
txtExclusion = new JTextField("", 9);
...
我知道如何一个接一个地做:

txtSelection.setHorizontalAlignment(JTextField.CENTER);

txtSelection.addFocusListener(new FocusAdapter() {

  public void focusGained(FocusEvent e) {

    txtSelection.select(0, 9);
  }
});
但是我不想对所有文本字段重复该结构

我尝试了这个(以及一些变体),但是代码似乎没有任何作用:

pnlConditions = new JPanel();
pnlConditions.setLayout(new GridBagLayout());

for(final Component c : pnlConditions.getComponents())  // compiler insisted on 'final'
{
  ((JTextField)c).setHorizontalAlignment(JTextField.CENTER);

  if(c instanceof JTextField)
  {
    c.addFocusListener
      (new FocusAdapter()
        {
          @Override public void focusGained(FocusEvent e) 
          {
            ((JTextField)c).select(0,9);   // compiler suggested cast to JTextComponent; no difference
          }
        }
      );
  }
}
未选择整个字段;对齐是左对齐(默认)。我想我认为它不起作用的第一个线索是编译器坚持
c
必须是
for
中的
final
,并建议强制转换应该是
JTextComponent
语句中的
select
;但它并没有在带有
setHorizontal…
的声明中提出这一建议

我相信这是可以做到的;但是怎么做呢


以下是包含上述代码段的整个方法:

  static void makePnlConditions(){
    JLabel lblSelections = new JLabel("Select ONLY combos with ALL of:");
    JLabel lblInclusions = new JLabel("DE-select combo NOT containing one or more of:");
    JLabel lblExclusions = new JLabel("DE-select combo containing ANY of:");

    txtSelection = new JTextField("", 9);
    txtInclusion = new JTextField("", 9);
    txtExclusion = new JTextField("", 9);

    pnlConditions = new JPanel();
    pnlConditions.setLayout(new GridBagLayout());

    for(final Component c : pnlConditions.getComponents())
    {
      ((JTextField)c).setHorizontalAlignment(JTextField.CENTER);

      if(c instanceof JTextField)
      {
        c.addFocusListener
          (new FocusAdapter()
            {
              @Override public void focusGained(FocusEvent e) 
              {
                ((JTextField)c).select(0,9);
              }
            }
          );
      }
    }

    pnlConditions.add(lblSelections);
    pnlConditions.add(txtSelection);
    pnlConditions.add(lblInclusions);
    pnlConditions.add(txtInclusion);
    pnlConditions.add(lblExclusions);
    pnlConditions.add(txtExclusion);
  }

首先将组件添加到
JPanel
中,否则
pnlConditions.getComponents()
将返回一个空数组,并且不会为
JTextField
添加侦听器

如果要选择整个文本,请使用方法

示例代码:

JPanel pnlConditions = new JPanel();
pnlConditions.setLayout(new GridBagLayout());

pnlConditions.add(lblSelections);
pnlConditions.add(txtSelection);
pnlConditions.add(lblInclusions);
pnlConditions.add(txtInclusion);
pnlConditions.add(lblExclusions);
pnlConditions.add(txtExclusion);

for (final Component c : pnlConditions.getComponents()) {      
    if (c instanceof JTextField) {
        ((JTextField) c).setHorizontalAlignment(JTextField.CENTER);
        ...
    }
}
class MyJTextField extends JTextField {

    // Initialization block that is called for all the constructors
    {
        this.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                selectAll();
            }
        });
        this.setHorizontalAlignment(JTextField.CENTER);
    }

    public MyJTextField() {}
    public MyJTextField(String text) {super(text);}
    public MyJTextField(int columns) {super(columns);}
    public MyJTextField(String text, int columns) {super(text, columns);}
}

我希望面板中的几个文本字段中的每个字段都有一个中心对齐,并且有一个焦点侦听器,当获得焦点时,该侦听器将选择整个字段

txtSelection = new JTextField("", 9);
txtInclusion = new JTextField("", 9);
txtExclusion = new JTextField("", 9);
...
创建一个扩展
JTextField
的自定义类,提供所有默认实现,并在应用程序中的任何地方使用它,使其集中化

示例代码:

JPanel pnlConditions = new JPanel();
pnlConditions.setLayout(new GridBagLayout());

pnlConditions.add(lblSelections);
pnlConditions.add(txtSelection);
pnlConditions.add(lblInclusions);
pnlConditions.add(txtInclusion);
pnlConditions.add(lblExclusions);
pnlConditions.add(txtExclusion);

for (final Component c : pnlConditions.getComponents()) {      
    if (c instanceof JTextField) {
        ((JTextField) c).setHorizontalAlignment(JTextField.CENTER);
        ...
    }
}
class MyJTextField extends JTextField {

    // Initialization block that is called for all the constructors
    {
        this.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                selectAll();
            }
        });
        this.setHorizontalAlignment(JTextField.CENTER);
    }

    public MyJTextField() {}
    public MyJTextField(String text) {super(text);}
    public MyJTextField(int columns) {super(columns);}
    public MyJTextField(String text, int columns) {super(text, columns);}
}

@谢谢!我明显错误地认为,在添加到面板之前,字段必须完整,这使我无法执行您明确指出的操作:将循环移动到所有添加的下方。就这么多了。我还感谢您就
selectAll
向我提供的建议;我也错过了,虽然
select(0,9)
做了这项工作,但效率不高。@Braj--FYI--我制作了一个
centerAndSelect(JPanel p)
方法来完成我要求的任务。在这个程序中,我从两个不同的地方调用它,我想从现在起,我将大量使用它(可能还会扩展它)!(我刚刚意识到你的答案还有第二部分,关于扩展JTextField…必须研究一下。)。。。(刚刚做到了!酷!)是的,有很多方法可以概括它。1.)创建一个单独的方法来移动公共代码2.)按照建议创建自定义类。根据您当前的应用程序设计和编码,选择任何一种更简单的方法。