`
rcyl2003
  • 浏览: 237317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

带提示的JTextField之二

阅读更多
转自一文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(2222)));

        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(2102102100);
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相加, 不知道还有其他方法吗?
评论

相关推荐

    带水印(背景)的JTextField

    标题中的“带水印(背景)的JTextField”指的是在Java Swing编程中,为JTextField组件添加水印或背景图像的功能。在Java图形用户界面设计中,JTextField是用于接收单行文本输入的基本组件。而水印效果通常是指在...

    原创:java封装了的JTextField,可以达到google输入框的效果

    在标准的`JTextField`中,虽然没有内置的自动联想或提示功能,但开发者可以通过自定义和扩展`JTextField`的功能来实现类似Google输入框的效果。 这篇原创文章描述的是如何在Java中封装`JTextField`,以实现输入时的...

    java JTextField组件的使用

    2. **创建JTextField** 创建JTextField非常简单,可以通过构造函数完成。例如: ```java JTextField textField = new JTextField(); ``` 如果需要初始化文本内容或设置默认值,可以传递字符串参数: ```java ...

    JTextField输入时实现位数监听

    // 这里可以进行错误提示,或者移除超出部分的字符 String text = document.getText(0, maxChars); ((PlainDocument) document).replace(0, length, text); } } } ``` 接下来,我们需要将这个监听器添加到`...

    控制JTextField的输入

    博客中可能还提到了`ConstStr.java`这个文件,这可能是一个包含常量字符串的类,如用于提示信息或错误消息的字符串。在控制`JTextField`输入时,这些常量可以用来显示用户输入不合法的警告或错误信息。 总的来说,...

    Java 模仿谷歌搜索框中输入下拉提示(自动补全)功能 源代码

    模仿谷歌搜索框中输入下拉提示(自动补全)功能,访问数据库调去数据,内有数据库SQL文件,数据库JDBC连接方式,记得填写正确的username="" password="" 在tomcat 的lib文件夹中 中导入mysql 驱动包【mysql包文件夹中有...

    点击提示框提示信息消失

    当鼠标点击文本框,提示信息消失 提示信息框,最多允许输入150个汉字 &lt;textarea id="info" rows="5" cols="50" &lt;/div&gt;

    java swing文本框(密码框)没有内容时,占位显示默认信息(仿IOS)

    2. **定位标签**:将这个标签放置在`JTextField`或`JPasswordField`的顶部,可以通过设置布局管理器(如`GridBagLayout`或`BoxLayout`)或者直接调整组件的位置来实现。 3. **设置事件监听器**:为`JTextField`或`...

    java文本框自动提示

    你可以在`JTextField`上使用`AutoCompleteDecorator`装饰器,然后提供一个数据源,JAutoComplete会自动处理后续的匹配和提示显示。 5. **性能优化**: 当数据源非常大时,为了提高性能,可以使用模糊搜索算法(如...

    textField限制输出长度

    在IT行业中,特别是涉及到用户界面(UI)设计和开发时,`textField` 是一个常见的元素,用于接收用户的文本输入。...在实际项目中,根据具体需求,还可以进一步优化,例如添加输入提示、错误提示等。

    java Swing 气泡浮动提示窗口代码

    2. **布局管理**:使用合适的布局管理器,例如BorderLayout或GridBagLayout,来放置提示信息(如JLabel)和可能的图标(如JIcon)。在设计布局时,确保气泡提示窗口的形状和大小符合预期,通常是不规则形状,底部有...

    java gui登录页面和消息提示框.zip

    - **Swing组件**:通常使用JFrame作为主窗口,JLabel和JTextField用于显示提示和输入用户名与密码,JButton用于触发登录事件。此外,可能还使用了JPasswordField来隐藏密码输入。 - **事件监听**:使用...

    Swing组件下载(常用组件)

    2. JTabbedPane: 用于创建带有标签的页面,用户可以通过点击标签在不同的内容之间切换。 3. JSplitPane: 用来创建可以动态调整大小的两个或更多区域的视图。用户可以拖动分隔线来改变各部分的大小。 4. ...

    基于Java的实例源码-搜索自动提示 Autotips.zip

    在Java Swing或JavaFX这样的图形用户界面(GUI)库中,我们可以创建一个JTextField或类似的文本输入组件,并为其添加KeyListener或DocumentListener。当用户输入时,这些监听器会接收到事件,然后调用后台服务或方法...

    超市管理系统 Java Swing + MySQL JDBC开发

    利用SWING编程实现商品的管理,要求如下: ...2、在“商品名称”对应的JTextField中输入商品名称,单击“查询”:如果存在该商品,则显示如图2所示的窗体;若输入的名称不存在,则弹出“没找到该商品!”的对话框。

    AutoText:Java Swing 库,允许将自动完成的可能性添加到文本组件(JTextComponent - JTextField - JFormattedTextField 等)

    2. **JTextField**: 这是最基本的单行文本输入组件,用户可以在这里输入和编辑文本。通过集成AutoText库,开发者可以让JTextField具备自动完成的功能。 3. **JFormattedTextField**: 这个组件在JTextField的基础上...

    学生信息系统

    JOptionPane.showMessageDialog(null, "请选择你要修改的内容", "温馨提示", JOptionPane.INFORMATION_MESSAGE); }else{ editFrame ef=new editFrame(this); ef.学号.setText((String)table....

    java浏览器

    JTextField jtfAddress; //输入html文件地址或网址 JButton jbGo; //转到文件按钮 JTextPane jtpShow; //显示文件 JLabel jlInfo; //提示信息 public HTTPBrowserDemo() { super("韩公达制作的html浏览器")...

    Java语言程序设计ppt-第十二章(UML图)

    Java语言程序设计ppt-第十二章(UML图) 本章节主要介绍了Java GUI程序设计的基础知识,包括Swing和AWT的区别、Java GUI API的层次结构、如何使用GUI组件创建用户界面、布局管理器的作用、如何使用Color类和Font类...

Global site tag (gtag.js) - Google Analytics