这个小小的点击事件,也让我想了一个晚上,不禁让我怀疑我的脑袋装的到底是什么。由于经验不足,
所以可能采用的方法不是最优解。大家将就着参考下。大概的效果如下,什么?别想歪了,我说的是文本
框的点击清除,不是那个华丽的界面。(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 }
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: