2014-06-21 23 views
1

我希望面板中的幾個文本字段中的每一個都具有中心對齊,並且有一個焦點偵聽器,在獲得焦點時將選擇整個字段。概括幾個文本字段,用於在獲得焦點時選擇整個文本

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必須finalfor和暗示演員應該在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); 
    } 

回答

2

首先添加組件到JPanel否則pnlConditions.getComponents()將返回一個空數組並沒有聽衆將被添加爲JTextField

如果要選擇整個文本,然後使用JTextComponent#selectAll()方法。

示例代碼:

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

我希望每個多個文本字段的在面板上有居中對齊,並有一個焦點偵聽器,在獲得焦點時,將選擇整個字段。

創建一個自定義類,它擴展了JTextField,提供所有默認實現並在應用程序中的任何地方使用它來使其集中化。

示例代碼:

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

@Braj ---謝謝!我明顯的誤解認爲,在添加到面板之前,該字段必須完整,否則無法執行您明顯的操作:將循環移動到所有添加點之下。這就是它所需要的。我也欣賞你建議我關於'selectAll';我也錯過了,雖然'select(0,9)'完成了這項工作,儘管效率不高。 – DSlomer64

+0

@ Braj - FYI - 我做了一個方法'centerAndSelect(JPanel p)'來完成我詢問的任務。我從這個程序中的兩個不同的地方調用它,並且會從這裏開始使用它(並且可能擴展它),我想! (我只是意識到你的答案的第二部分,關於擴展JTextField ...需要研究這個)。(只是做了!很酷!) – DSlomer64

+0

是的,有很多方法可以推廣它。 1.)創建一個單獨的方法來移動通用代碼2.)按建議創建自定義類。根據您當前的應用程序設計和編碼選擇一個更容易。 – Braj

相關問題