转自一文online 昨天我们给JTextField增加了一个泡泡提示窗口,今天我们继续昨天的,首先处理在显示泡泡的时候忽略输入的Backspace、Enter、 Delete、Esc按键,然后加上错误的时候的声音提示,最后再给JTextField换装备,让它看起来像MSN 8.5beta的输入框,还是先放上图片:
这幅图是MSN的输入框,输入框的内部到光标有一部分是有点毛玻璃的感觉,不过这个style是死的,我们改进一下,我们的JTextField在输入之前是看似普通的,在鼠标放上去之后,看起来就与MSN的输入框类似了,而且我们还给这个输入框加入一个淡黄色的背景。
好了,现在很明确要做的事情了
1. 加入鼠标事件监听器,监听MouseEnter和MouseExit事件,根据这个两个事件设置不同的背景色和边框
2. 做一个能够显示毛玻璃效果的边框
以下是边框的代码和部分MyJTextField的代码,完整的代码待我会打包传上来的
MyJTextField.java
在初始化组件的时候加上Border的初始化:
<!----> hoverBorder = new CoolBorder(HOVER_BORDER_COLOR, 3);
border = BorderFactory.createCompoundBorder(new LineBorder(
BORDER_COLOR, 1), new EmptyBorder(new Insets(2, 2, 2, 2)));
setBackground(BACKGROUND_COLOR);
setBorder(border);
和事件的初始化:
<!----> addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
setBorder(hoverBorder);
setBackground(HOVER_BACKGROUND_COLOR);
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
setBorder(border);
setBackground(BACKGROUND_COLOR);
repaint();
}
});
以及屏蔽功能性按钮和发出声音提示的代码:
<!---->addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char input = e.getKeyChar();
// ESC27 ,Backspace 8 ,Enter 10, Del 127, must ignore
boolean ignoreInput = input == (char) KeyEvent.VK_ESCAPE
|| input == (char) KeyEvent.VK_BACK_SPACE
|| input == (char) KeyEvent.VK_ENTER
|| input == (char) KeyEvent.VK_DELETE;
if (ignoreInput) {
limitTip.setVisible(false);
numberTip.setVisible(false);
return;
}
if (getText().length() + 1 > limit) {
Toolkit.getDefaultToolkit().beep();
deleteInputChar(e);
limitTip.setVisible(true);
return;
} else {
limitTip.setVisible(false);
}
if (numberOnly) {
if (!Character.isDigit(input)) {
numberTip.setVisible(true);
Toolkit.getDefaultToolkit().beep();
deleteInputChar(e);
} else {
numberTip.setVisible(false);
}
}
}
private void deleteInputChar(KeyEvent source) {
source.setKeyChar((char) KeyEvent.VK_CLEAR);
}
});
下面是Border的完整代码:
<!----> 1 /**
2 * @(#)CoolBorder.java 0.1.2 2007-9-10
3 */
4 package ruislan;
5
6 import java.awt.Color;
7 import java.awt.Component;
8 import java.awt.Dimension;
9 import java.awt.GradientPaint;
10 import java.awt.Graphics;
11 import java.awt.Graphics2D;
12 import java.awt.Insets;
13
14 import javax.swing.border.Border;
15
16 /**
17 * Custom Border.
18 *
19 * @version 0.1.2, 2007-9-10
20 * @author ruislan <a href="mailto:z17520@126.com"/>
21 */
22 public class CoolBorder implements Border {
23 private int thickness;
24 private Insets insets;
25 private Dimension lastComponentSize;
26 private Color color;
27 private Color color2;
28
29 public CoolBorder(Color color, int thickness) {
30 this.color = color;
31 if (color == null) {
32 this.color = color = Color.gray;
33 }
34 color2 = new Color(210, 210, 210, 0);
35 this.thickness = thickness;
36 }
37
38 @Override
39 public Insets getBorderInsets(Component c) {
40 Dimension currentComponent = c.getSize();
41
42 if (currentComponent.equals(lastComponentSize)) {
43 return insets;
44 }
45
46 insets = new Insets(thickness, thickness, thickness, thickness);
47 lastComponentSize = currentComponent;
48 return insets;
49 }
50
51 @Override
52 public boolean isBorderOpaque() {
53 return true;
54 }
55
56 @Override
57 public void paintBorder(Component c, Graphics g, int x, int y, int width,
58 int height) {
59 Graphics2D g2d = (Graphics2D) g.create();
60 // 画上边缘
61 GradientPaint gp = new GradientPaint(x, y, color, x, y + thickness,
62 color2);
63 g2d.setPaint(gp);
64 g2d.fillRect(x, y, width, thickness);
65 // 画下边缘
66 gp = new GradientPaint(x, y + height - thickness - 1, color2, x, y
67 + height, color);
68 g2d.setPaint(gp);
69 g2d.fillRect(x, y + height - thickness - 1, width, thickness);
70 // 画左边缘
71 gp = new GradientPaint(x, y, color, x + thickness, y, color2);
72 g2d.setPaint(gp);
73 g2d.fillRect(x, y, thickness, height);
74 // 画右边缘
75 gp = new GradientPaint(x + width - thickness - 1, y, color2, x + width,
76 y, color);
77 g2d.setPaint(gp);
78 g2d.fillRect(x + width - thickness - 1, y, thickness, height);
79 // 画外框
80 g2d.setPaint(color);
81 g2d.drawRect(x, y, width - 1, height - 1);
82 g2d.dispose();
83 }
84
85 }
86
然后来欣赏我们的结果吧:
鼠标放上去之前
鼠标放上去之后
我们输入了不是数字的字符
至此,我们的JTextField又向前走了一步,下次我们还能如何改进呢?把JTextField这个死板的长方形改造成云状的或者其他形状的?
附源代码下载地址:http://www.blogjava.net/Files/ruislan/myjtextfield.zip
posted on 2007-09-10 13:21
ruislan 阅读(490)
评论(1) 编辑 收藏
<script type="text/javascript">
//
</script>
FeedBack:
你好!!
我在网上看到你这个textField的例子真的好震撼哦....崇拜一把
不过还是有点小问题, 你给textField定位的时候,
private void determineAndSetLocation() {
Point location = attachedComponent.getLocation();
setBounds(location .x, location .y - getPreferredSize().height,
getPreferredSize().width, getPreferredSize().height);
}
但是目前您的这个XY只是textField相对于他父panel的XY,但是你要show在layeredPane.
如果这个textField在多层panel里面的话,这样计算就不对. 所以你的location应该是textfield相对于layeredPane的XY才对
所以这里我想改一下 但是我不知道如何得到textField相对于layeredPane的X和Y呢?
我只想到一个相当笨的方法, 不断getParent()后在把所以XY相加, 不知道还有其他方法吗?
分享到:
相关推荐
模仿谷歌搜索框中输入下拉提示(自动补全)功能,访问数据库调去数据,内有数据库SQL文件,数据库JDBC连接方式,记得填写正确的username="" password="" 在tomcat 的lib文件夹中 中导入mysql 驱动包【mysql包文件夹中有...
当鼠标点击文本框,提示信息消失 提示信息框,最多允许输入150个汉字 <textarea id="info" rows="5" cols="50" </div>
利用SWING编程实现商品的管理,要求如下: ...2、在“商品名称”对应的JTextField中输入商品名称,单击“查询”:如果存在该商品,则显示如图2所示的窗体;若输入的名称不存在,则弹出“没找到该商品!”的对话框。
JOptionPane.showMessageDialog(null, "请选择你要修改的内容", "温馨提示", JOptionPane.INFORMATION_MESSAGE); }else{ editFrame ef=new editFrame(this); ef.学号.setText((String)table....
JTextField jtfAddress; //输入html文件地址或网址 JButton jbGo; //转到文件按钮 JTextPane jtpShow; //显示文件 JLabel jlInfo; //提示信息 public HTTPBrowserDemo() { super("韩公达制作的html浏览器")...
private JTextField jtfMonth = new JTextField(2);//jtfMonth月份显示文本框 private JPanel p1 = new JPanel(); //装入控制日期按钮的模块 private JPanel p2 = new JPanel(); private JPanel p3 = new ...
" "(3)左边面板中输入学生信息,点击"添加"按钮,将此学生信息插入stuinfo表 " "中,弹出插入是否成功的提示框。 " "(4)点击"删除"按钮,依据上边学号值删除该学生记录,弹出删除是否成功的提" "示框。 " "(5...
public static JTextField fromip2=new JTextField("0",3); //输入ip地址7~9位的输入框 public static JTextField fromip3=new JTextField("0",3); //输入起始ip地址最后4位的输入框 public static JTextField ...
JTextField及JPasswordField的空值处理,思路是采用图层Lable,并利用lable的无点击特性,类似ios文本框的空值默认显示。
private JTextField jtfMonth = new JTextField(2);//jtfMonth月份显示文本框 private JPanel p1 = new JPanel(); //装入控制日期按钮的模块 private JPanel p2 = new JPanel(); private JPanel p3 = new ...
\//提示信息的初始化 36 background2 = new JLabel(\请使用学号和姓名查询!\ background3 = new JLabel(\请使用学号和姓名查询!\ student = new ArrayList ; xingming1=new JLabel(\学生姓名:\//录入界面各个组件...
private JTextField[] jtfArray={ new JTextField(), new JTextField(30), new JTextField(30), new JTextField(30), new JTextField(30), new JTextField(30), new JTextField(30), new ...
private JTextField usernameField,emailField; private TextField teleField; private JPasswordField passwordField; private JButton registButton,cancelButton; public Text() { super("用户...
算数一”、“运算数二”、“运算结果”这些提示标签使用组件JLabel (或Label),输入运算数和输出运算结果使用JTextField(或 TextField),“相加”、“相减”和“全部清零”使用按钮JButton (或Button)。 请...
package cn.tedu.chart2; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.IOException; import ...
JTextField jtfAddress; //输入html文件地址或网址 JButton jbGo; //转到文件按钮 JTextPane jtpShow; //显示文件 JLabel jlInfo; //提示信息 public HTTPBrowserDemo(){ super("html浏览器"); //...
二、问题分析 1、基本解法:利用1 ~ 9 的数字在每一行、每一列、每一宫都只能出现一次的规则进行解题的方法。 实际寻找解的过程为: 使用单元排除法的目的就是要在某一单元(即行,列或区块)中找到能填入某一数 ...
","提示",JOptionPane.WARNING_MESSAGE); jtextfield1.setText(""); passwordText.setText(""); } con.close(); }catch(SQLException eee){System.out.println(eee);} } else{ System.exit(0); ...
登录界面:登录界面是有帐号,密码两个JTextField,管理员帐号一字母A开头,教师帐号一字母T开头,学生帐号以字母S开头,登录帐号或密码输入错误会弹出相应的提示对话框。 学生信息管理模块:管理员用于添加和...