我希望面板中的幾個文本字段中的每一個都具有中心對齊,並且有一個焦點偵聽器,在獲得焦點時將選擇整個字段。概括幾個文本字段,用於在獲得焦點時選擇整個文本
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
必須final
在for
和暗示演員應該在select
聲明JTextComponent
;但並沒有在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);
}
@Braj ---謝謝!我明顯的誤解認爲,在添加到面板之前,該字段必須完整,否則無法執行您明顯的操作:將循環移動到所有添加點之下。這就是它所需要的。我也欣賞你建議我關於'selectAll';我也錯過了,雖然'select(0,9)'完成了這項工作,儘管效率不高。 – DSlomer64
@ Braj - FYI - 我做了一個方法'centerAndSelect(JPanel p)'來完成我詢問的任務。我從這個程序中的兩個不同的地方調用它,並且會從這裏開始使用它(並且可能擴展它),我想! (我只是意識到你的答案的第二部分,關於擴展JTextField ...需要研究這個)。(只是做了!很酷!) – DSlomer64
是的,有很多方法可以推廣它。 1.)創建一個單獨的方法來移動通用代碼2.)按建議創建自定義類。根據您當前的應用程序設計和編碼選擇一個更容易。 – Braj