【Swing 5】文本框的点击清除和按键清除

时间:2024-04-12 10:47:39

  这个小小的点击事件,也让我想了一个晚上,不禁让我怀疑我的脑袋装的到底是什么。由于经验不足,

所以可能采用的方法不是最优解。大家将就着参考下。大概的效果如下,什么?别想歪了,我说的是文本

框的点击清除,不是那个华丽的界面。(Swing快哭了 Q~Q)

 

【Swing 5】文本框的点击清除和按键清除

 

1. 先来写好一个基本的界面,为了节省空间。这里就不设置按钮了。

package demo;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class T1 {
    public static void main(String[] args) {
        T1 t = new T1();
        t.buildGui();
    }
    public void buildGui() {
        JFrame f = new JFrame("登录界面");
        
        JPanel userPanel = new JPanel();
        JTextField userText = new JTextField(10); // 设置字宽为10而不是10像素
        userText.setText("QQ号码/手机/邮箱");      // 设置文本框的提示信息 
        userText.setForeground(Color.lightGray);  // 设置前景色为浅灰色(提示信息的颜色)
        userPanel.add(new JLabel("用户:"));
        userPanel.add(userText);
        
        JPanel passPanel = new JPanel();
        JTextField passText = new JTextField(10);
        passText.setText("密码");
        passText.setForeground(Color.lightGray);
        passPanel.add(new JLabel("密码:"));
        passPanel.add(passText);
        
        f.add("North", userPanel);
        f.add("Center", passPanel);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 当界面关闭时结束javaw.exe进程
        f.setSize(400, 300);                              // 设置界面为400x300像素(长x宽)
        f.setVisible(true);                                  // 设置界面可见性, 少了这句或设为false窗口不显示
    }
}

 

2. 接下来就是让焦点转移,昨晚一直以为要点击才能。后来发现按Tab键也能清除。

  所以才知道不是使用鼠标事件的方法

【Swing 5】文本框的点击清除和按键清除【Swing 5】文本框的点击清除和按键清除
 1 package demo;
 2 
 3 import javax.swing.*;
 4 import java.awt.*;
 5 import java.awt.event.*;
 6 
 7 public class Test {
 8     JTextField userText;
 9     JTextField passText;
10     public static void main(String[] args) {
11         Test t = new Test();
12         t.buildGui();
13     }
14     public void buildGui() {
15         JFrame f = new JFrame("登录界面");
16         
17         JPanel userPanel = new JPanel();
18         userText = new JTextField(10);            // 设置字宽为10而不是10像素
19         userText.setText("QQ号码/手机/邮箱");      // 设置文本框的提示信息 
20         userText.setForeground(Color.lightGray);  // 设置前景色为浅灰色(提示信息的颜色)
21 
22         userPanel.add(new JLabel("用户:"));
23         userPanel.add(userText);
24         
25         JPanel passPanel = new JPanel();
26         passText = new JTextField(10);
27         passText.setText("密码");
28         passText.setForeground(Color.lightGray);
29         
30         passPanel.add(new JLabel("密码:"));
31         passPanel.add(passText);
32         
33         f.add("North", userPanel);
34         f.add("Center", passPanel);
35         
36         f.setFocusable(true);           // 由于焦点默认是在第一个文本框上的, 所以这里把它弄掉
37         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 当界面关闭时结束javaw.exe进程
38         f.setSize(400, 300);                               // 设置界面为400x300像素(长x宽)
39         f.setVisible(true);                 // 设置界面可见性, 少了这句或设为false窗口不显示
40         
41         /*添加一个循环, 首先判断焦点(鼠标光标)是否在文本框上,
42         如果焦点在文本框上, 且内容不是自己输入的话(还是提示信
43         息), 如果不在, 则再进一步判断该文本框是否存在信息, 若
44         为空,则恢复提示信息*/
45         while (true) {
46             if (userText.hasFocus()) {
47                 if (userText.getText().equals("QQ号码/手机/邮箱")) {
48                     userText.setText("");
49                 }
50             }
51             else {
52                 if (userText.getText().equals("")) {
53                     userText.setText("QQ号码/手机/邮箱");
54                 }
55             }
56             
57             if (passText.hasFocus()) {
58                 if (passText.getText().equals("密码")) {
59                     passText.setText("");
60                 }
61             }
62             else {
63                 if (passText.getText().equals("")) {
64                     passText.setText("密码");
65                 }
66             }
67         }
68     }
69 }
点击清除提示信息

由于焦点默认是在第一个文本框上的,所以在代码中,我们把它取消掉。

Ok,开始执行,一开始出现如下界面。提示用户要输入的内容~

【Swing 5】文本框的点击清除和按键清除

 

点击后提示信息消失, 一切搞定!

 【Swing 5】文本框的点击清除和按键清除

方法2 

2/14号晚上, 在网上偶然发现了原来还有已经写好的接口可以用的。(Q^Q) 就是和上

面我们写的循环类似, 不过这次是实现FocusListener接口的两个方法。获得焦点的方

法(focusGained(FocusEvent e))和失去焦点的方法(focusLost(FocusEvent e))~

【Swing 5】文本框的点击清除和按键清除【Swing 5】文本框的点击清除和按键清除
 1 package demo;
 2 
 3 import javax.swing.*;
 4 import java.awt.*;
 5 import java.awt.event.*;
 6 
 7 public class Test {
 8     JTextField userText, passText;
 9     
10     public static void main(String[] args) {
11         Test t = new Test();
12         t.buildGui();
13     }
14     
15     public void buildGui() {
16         JFrame f = new JFrame("设置");
17         
18         JPanel userPanel = new JPanel();
19         userText = new JTextField(10);
20         userText.setText("QQ号码/手机/邮箱");
21         userText.setForeground(Color.lightGray);
22         userText.addFocusListener(new UserTextClickClearListener());
23         
24         userPanel.add(new JLabel("用户: "));
25         userPanel.add(userText);
26         
27         JPanel passPanel = new JPanel();
28         passText = new JTextField(10);           // 设置字宽为10而不是10像素
29         passText.setText("密码");                 // 设置文本框的提示信息 
30         passText.setForeground(Color.lightGray); // 设置前景色为浅灰色(提示信息的颜色)
31         passText.addFocusListener(new PassTextClickClearListener());
32         
33         passPanel.add(new JLabel("密码: "));
34         passPanel.add(passText);
35         
36         f.add("North", userPanel);
37         f.add("Center", passPanel);
38         f.setFocusable(true);             // 由于焦点默认是在第一个文本框上的, 所以这里把它弄掉
39         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 当界面关闭时结束javaw.exe进程
40         f.setSize(400, 300);                               // 设置界面为400x300像素(长x宽)
41         f.setVisible(true);                 // 设置界面可见性, 少了这句或设为false窗口不显示
42         
43     }
44     
45     /*实现FocusListener接口的方法, 重载focusGained()方法,当获得焦点时, 
46     判断文本框的内容是否仍然是提示信息, 而不是用户输入信息, 如是, 则清除,
47     重载focusLost()方法, 当失去焦点时, 判断文本框是否为空, 是就恢复提示*/
48     class UserTextClickClearListener implements FocusListener {
49         public void focusGained(FocusEvent e) {
50             if (userText.getText().equals("QQ号码/手机/邮箱")) {
51                 userText.setText("");
52             }
53         }
54         public void focusLost(FocusEvent e) {
55             if (userText.getText().equals("")) {
56                 userText.setText("QQ号码/手机/邮箱");
57             }
58         }
59     }
60     
61     class PassTextClickClearListener implements FocusListener {
62         public void focusGained(FocusEvent e) {
63             if (passText.getText().equals("密码")) {
64                 passText.setText("");
65             }
66         }
67         public void focusLost(FocusEvent e) {
68             if (passText.getText().equals("")) {
69                 passText.setText("密码");
70             }
71         }
72     }
73 }
版本2

 

3. 版本二是使用键盘实现文本框的提示信息清除,这自然要用到键盘事件的方法。

 2/15号,也是晚上,这个问题终于解决了,如释重负。去沿江路兜了一圈才骑车回来。

现在又是一个深夜,万籁俱寂的时候。

2/17生病,头重重的,中断了

2/18好的七七八八了,想到了个有bug的版本

问题1: 

不让光标移动可以理解为一直把它固定在位置0处】

// 当没输入信息时,不让光标移动

if (userText.getText().equals("QQ号码/手机/邮箱")) {
    userText.setCaretPosition(0);
}

问题2: 

【记得一并把提示信息的颜色(前景色)恢复】

// 清空内容时,恢复提示信息, 注意: 提示信息的颜色和用户输入信息的颜色是不一样的

if (userText.getText().equals("") {
    userText.setText("QQ号码/手机/邮箱");
    userText.setForeground(Color.lightGray);
}

问题3: 

 

相关文章