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.)按照建议创建自定义类。根据您当前的应用程序设计和编码,选择任何一种更简单的方法。