仅使用MouseListener java鼠标单击时清除JTextField

时间:2016-04-22 13:38:04

标签: java swing jtextfield mouselistener

我知道如何通过鼠标单击清除JTextField:

    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的访问权限,是否位​​于JFrame上的ButtonDemo中? 切换...案例我需要那里,因为会有多个JTextField。 第二个问题 - 这种方法完全不好吗?

2 个答案:

答案 0 :(得分:1)

  

Switch ... case我需要那里因为有多个JTextField。第二个问题 - 这种方法完全不好吗?

使用不合适设计的开关盒:

  1. 如果处理相同,则不需要开关盒,只需获取组件并进行处理。
  2. 因此,使用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. 如果对每个组件进行不同的处理,则应为每个组件使用单独的侦听器。
    2. 因此,在这种情况下,您将创建一个包含参数的公共类,以便您可以自定义处理。

      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等。

答案 1 :(得分:0)

您可以在创建时为每个JTextField设置名称,如下所示:

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

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