4

stackoverflow.com我正在尝试重现 Firefox 或 Safari 的搜索字段或此页面右上角的搜索字段的行为。

我的意思是,当 editable 上没有文本时JComboBox,会显示说明文本,例如"Type here"或其他。当JComboBox聚焦时,文本被删除。如果在没有输入文本的情况下失去焦点,则说明文本会返回。

4

2 回答 2

5

笔记:

查看文本提示以获得以下代码的更完整实现以及更多功能。


这是我拼凑起来的一些简单的东西。我相信你可以整理它。由于代码适用于 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);
    }
}
于 2009-11-26T21:13:45.400 回答
0

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

于 2009-11-26T20:53:54.757 回答