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

标签 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) {

}

}

如何访问位于 JFrame 上 ButtonDemo 中的 JTextField? Switch...case 我需要那里,因为会有多个 JTextField。 第二个问题 - 这种方法完全不好吗?

最佳答案

Switch...case I need there because there will more than one JTextField. Second question - Is this approach totally bad?

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

  1. 如果处理是一样的,那么就不需要switch case,直接获取组件并进行处理即可。

因此,使用 FocusListener 方法,基本代码将是:

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

这样做的问题是,每次文本字段获得焦点时,文本都会被清除。您可能只想在显示默认提示“在此处输入文本”时清除文本,这导致了第二种方法

  • 如果您对每个组件有不同的处理,那么您应该为每个组件使用单独的监听器。
  • 因此,在这种情况下,您将创建一个包含参数的公共(public)类,以便您可以自定义处理。

    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它实现了这个基本功能以及更多功能。

    关于java - 仅使用 MouseListener java 当鼠标单击时清除 JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36795415/

    相关文章:

    java - 在没有在 ContentValues 中设置所有列的情况下更新数据库中的项目

    java - spring如何配置CommonsPool2TargetSource?

    java - 如何找到与象限无关的点与x轴的角度?

    java - 旋转 jlabel java swing

    Java Swing - 动态创建JTextField

    java - 如何检查 Swing 中的文本是否被选中?

    java - Tomcat——Web 服务器还是 Web 容器?

    java - 您如何在 Java Swing 应用程序框架中处理命令行参数

    java - Jtable 不可见?

    java - 如何在java中验证文本字段