2013-06-05 222 views
2

我在窗体上有一些文本字段。我喜欢focusGained和focusLost事件。使用2或3文本字段很容易。但是,在18个文本字段之后,好吧,它有点混乱。 有什么办法可以缩短focusGained和focusLost事件吗? 例子:重点获得和焦点丢失Java

txtSomeTextFocusGained(java.awt.event FocusEvent evt){ 
    if(txtSomeText.getText().equals("Text here!"){ 
     txtSomeText.setText(""); 
    } 
} 

txtSomeTextFocusLost(java.awt.event FocusEvent evt){ 
    if(txtSomeText.getText().equals(""){ 
     txtSomeText.setText("Text here!"); 
    } 
} 

这是一个文本字段,我有问题,约18文本字段处理。任何方式来简化? 谢谢。

+0

编辑您的问题以更好地解释它 – pinkpanther

+0

如何?我是新来的问。谢谢。 – bentinata

+2

如果您对所有18个文本字段都做同样的事情(事件明智),您可以对每个文本字段使用相同的事件处理程序 – Timr

回答

3

该方法很简单,所以我想不出一种方法来进一步简化它们。你可以做的,但是,通过声明一个 FocusListener实例,然后使用addFocusListener(...)全部文本字段来防止代码重复。

这将是这个样子:

// Instantiate a FocusListener ONCE 
java.awt.event.FocusListener myFocusListener = new java.awt.event.FocusListener() { 
    public void focusGained(java.awt.event.FocusEvent focusEvent) { 
     try { 
      JTextField src = (JTextField)focusEvent.getSource(); 
      if (src.getText().equals("Text here!") { 
       src.setText(""); 
      } 
     } catch (ClassCastException ignored) { 
      /* I only listen to JTextFields */ 
     } 
    } 

    public void focusLost(java.awt.event.FocusEvent focusEvent) { 
     try { 
      JTextField src = (JTextField)focusEvent.getSource(); 
      if (src.getText().equals("") { 
       src.setText("Text here!"); 
      } 
     } catch (ClassCastException ignored) { 
      /* I only listen to JTextFields */ 
     } 
    } 
}; 

(你可以,如果你是绝对确保事件的源将始终是一个JTextField省略try-catch块,但它始终是一个坏实践依靠这样的假设)

然后,对于每一个JTextField中你只需要添加相同的FocusListener:

... 
someTextField.addFocusListener(myFocusListener); 
... 

(这只是半年线 - 很难获得比这更短)


另一种方法是子类的JTextField,在构造函数中添加的FocusListener,但我看不出有什么好处通过第一个解决方案(除非你想要一个更灵活/强大的解决方案,例如每个JTextField的不同文本等)。

+0

非常感谢。即使我确定**绝对**,源始终是jTextField,我永远不会忽略try-catch,这是一个坏主意。 – bentinata

1

如果您只想在字段中设置一些焦点集中的文本,您可以编写分离的事件处理程序类,它实现FocusListener,然后重写focusGainedfocusLost方法。就像这样:

import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 

import javax.swing.JTextField; 

public class CustomFocusListener implements FocusListener { 
    JTextField txt; 
    String textWhenFocusGained; 
    String textWhenFocusLost; 

    public CustomFocusListener(JTextField txt, String textWhenFocusGained, 
      String textWhenFocusLost) { 
     this.txt = txt; 
     this.textWhenFocusGained = textWhenFocusGained; 
     this.textWhenFocusLost = textWhenFocusLost; 
    } 

    @Override 
    public void focusGained(FocusEvent arg0) { 
     txt.setText(textWhenFocusGained); 
    } 

    @Override 
    public void focusLost(FocusEvent arg0) { 
     txt.setText(textWhenFocusLost); 
    } 


}