在空的空间添加水印JCombobox

问题描述:

我试图重现Firefox或Safari的搜索字段或本页面右上角的搜索字段stackoverflow.com的行为。在空的空间添加水印JCombobox

我的意思是,当可编辑JComboBox上没有文字时,会显示说明文字,如"Type here"或其他。当JComboBox聚焦时,文本被删除。如果在没有输入文字的情况下焦点丢失,说明文字会回来。

这里有一些简单的我扔在一起。我相信你可以整理它。由于代码在JTextField上工作,您需要获取组合框的编辑器。我没有关于如何实施Glazed列表,所以我只是猜测它会为你工作。

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

public class TextPrompt extends JLabel 
    implements FocusListener, DocumentListener 
{ 
    private JTextComponent component; 
    private Document document; 

    public TextPrompt(String text, JTextComponent component) 
    { 
     this.component = component; 
     document = component.getDocument(); 

     setText(text); 
     setFont(component.getFont()); 
     setBorder(new EmptyBorder(component.getInsets())); 

     component.addFocusListener(this); 
     document.addDocumentListener(this); 

     component.add(this); 
    } 

    public void checkForPrompt() 
    { 
     if (document.getLength() == 0) 
      setSize(component.getSize()); 
     else 
      setSize(0, 0); 
    } 

// Implement FocusListener 

    public void focusGained(FocusEvent e) 
    { 
     checkForPrompt(); 
    } 

    public void focusLost(FocusEvent e) 
    { 
     setSize(0, 0); 
    } 

// Implement DocumentListener 

    public void insertUpdate(DocumentEvent e) 
    { 
     checkForPrompt(); 
    } 

    public void removeUpdate(DocumentEvent e) 
    { 
     checkForPrompt(); 
    } 

    public void changedUpdate(DocumentEvent e) {} 

    public static void main(String[] args) 
    { 
     JPanel panel = new JPanel(); 
     JTextField tf1 = new JTextField(10); 
     panel.add(tf1); 
     JTextField tf2 = new JTextField(10); 
     panel.add(tf2); 

     new TextPrompt("First Name", tf1); 
     new TextPrompt("Last Name", tf2); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

几乎适合我的使用情况已知的术语。我只做了三个改变:1)当关注时,必须没有文本,所以我在checkForPrompt上添加了“&&!component.hasFocus”。 2)在focusLost上我调用checkForPrompt而不是setSize。 3)启动时必须有一个checkForPrompt调用,用于初始可见性状态。此调用必须在布局大小计算后进行,否则component.getSize()将为0. 谢谢! – tuler 2009-11-27 00:34:50

+1

此课程已更新为更多功能。请参阅:[文本提示](http://tips4java.wordpress.com/2009/11/29/text-prompt/) – camickr 2013-02-17 01:17:52

它被称为waterMark。 jQuery有一个。我从不厌倦将水印应用于jComboBox。
祝你好运

+0

感谢,我一直在寻找这个 – tuler 2009-11-26 21:10:02