繁体   English   中英

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

[英]Clear JTextField when mouse click using only MouseListener java

我知道如何通过单击鼠标清除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) {

}

}

在JFrame的ButtonDemo中,如何访问JTextField? 切换...我需要在那里的情况 ,因为这里将有多个JTextField。 第二个问题-这种方法完全不好吗?

切换...我需要在那里的情况,因为这里将有多个JTextField。 第二个问题-这种方法完全不好吗?

在不正确的设计中使用开关盒:

  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") );

或者,如果您想花哨的话,可以查看实现此基本功能等的文本提示

您可以通过在创建每个JTextField时为其设置名称来做到这一点,如下所示:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM