2016-04-22 54 views
0

私はマウスクリックでのJTextFieldをクリアする方法を知って使用してマウスクリック時に:クリアJTextFieldが唯一のMouseListenerは、Java

JLabel jlab; 

ButtonDemo() { 
    JFrame jfrm = new JFrame("A button example"); 
    jfrm.setLayout(new FlowLayout()); 
    jfrm.setSize(500, 200); 
    jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jfrm.setVisible(true); 
    JTextField jtf=new JTextField("enter text here"); 
    jtf.setName("jtf1"); 
    jfrm.add(jtf); 
    jtf.addActionListener(this); 
    jtf.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e){ 
      jtf.setText(""); 

     } 

     }); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new ButtonDemo(); 
      } 
     } 
     ); 
    } 
} 

しかし、私はのMouseListenerを使用する必要があります:

... 
jtf.addMouseListener(new MListener()); 
... 

import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

public class MListener implements MouseListener{ 

@Override 
public void mouseClicked(MouseEvent e) { 
    System.out.println("mouseClicked " + e.paramString()+"    e.getComponent().getName() -> "+e.getComponent().getName()); 

} 

@Override 
public void mousePressed(MouseEvent e) { 
//  switch(e.getComponent().getName())){ 
//   case "jtf1": Here I need access to ButtonDemo jtf1 element ; 
//  } 

} 
@Override 
public void mouseReleased(MouseEvent e) { 

} 
@Override 
public void mouseEntered(MouseEvent e) { 

} 
@Override 
public void mouseExited(MouseEvent e) { 

} 

} 

はどのようにアクセスを得ることができますJTextField whisはJFrameのButtonDemoにありますか? スイッチ...ケース複数のJTextFieldが存在するため、必要です。 2番目の質問 - このアプローチは完全に悪いですか?

+2

JTextFieldフォーカスリスナーは、あなたのケースでうまくいくでしょうか? – Tin

+0

上記の文を明確にするために、マウスとキーボードの両方の使用のためにGUIを設計する必要があります。したがって、ユーザーがテキストフィールドに「クリック」または「タブ」した場合は、テキストをクリアする必要があります。そのため、FocusListenerを使用する必要があります。 – camickr

答えて

0

あなたはそれを作成するときに、このように、それぞれのJTextFieldに名前を設定することによって、それを行うことができます。

JTextField textField = new JTextField(); 
textfield.setName("text1"); 

// Later on the event controller 
if (((JTextField) event.getSource().equals("text1")) { 
    // Do any stuff here 
} 
1

つ以上のJTextFieldがするので、私はそこに必要なスイッチ...ケース。 2番目の質問 - このアプローチは完全に悪いですか?ない適切な設計で、スイッチケースを使用して

  1. 処理が同じである場合、スイッチケースのための必要はありません、あなただけのコンポーネントを取得し、処理を行います。だから、のFocusListenerを使用して

は、基本的なコードは次のようになりアプローチ:これで

FocusListener fl = new FocusAdapter() 
{ 
    @Override 
    public void focusGained(FocusEvent e) 
    { 
     JTextField component = (JTextField)e.getSource(); 
     component.setText(""); 
    } 
}; 
... 
textField1.add(fl); 
textField2.add(fl); 
... 

問題は、テキストフィールドのゲインはテキストがクリアされます焦点を当てるたびに。デフォルトのプロンプト "ここにテキストを入力"が表示されている場合にのみ、テキストを消去したいと思うかもしれません。

  1. 各コンポーネントごとに処理が異なる場合は、各コンポーネントに別々のリスナーを使用する必要があります。

この場合、処理をカスタマイズできるようにパラメータを含む共通クラスを作成します。

public class ClearTextPrompt extends FocusAdapter 
{ 
    private String prompt; 

    public ClearTextPrompt(String prompt) 
    { 
     this.prompt = prompt; 
    } 

    @Override 
    public void focusGained(FocusEvent e) 
    { 
     JTextField textField = (JTextField)e.getSource(); 

     if (prompt.equals(textField.getText()) 
      textField.setText("");   
    } 
} 

は、その後、あなたは次のようにクラスを使用します。

textField1.addFocusListener(new ClearTextPrompt("Enter First Name")); 
textField2.addFocusListener(new ClearTextPrompt("Enter Last Name")); 

それとも空想を取得したい場合は、この基本的な機能などを実装しText Promptをチェックアウトすることができます。