这个小小的点击事件,也让我想了一个晚上,不禁让我怀疑我的脑袋装的到底是什么。由于经验不足,
所以可能采用的方法不是最优解。大家将就着参考下。大概的效果如下,什么?别想歪了,我说的是文本
框的点击清除,不是那个华丽的界面。(Swing快哭了 Q~Q)
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键也能清除。
所以才知道不是使用鼠标事件的方法
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,开始执行,一开始出现如下界面。提示用户要输入的内容~
点击后提示信息消失, 一切搞定!
方法2
2/14号晚上, 在网上偶然发现了原来还有已经写好的接口可以用的。(Q^Q) 就是和上
面我们写的循环类似, 不过这次是实现FocusListener接口的两个方法。获得焦点的方
法(focusGained(FocusEvent e))和失去焦点的方法(focusLost(FocusEvent e))~
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: