Java Swing JTextField设置占位符。

30

我创建了一个JTextField,现在想在它上面设置占位符,但不知道该怎么做。请帮忙。这是我的代码:

JTextField database=new JTextField("Enter Data Base Name");
database.setPreferredSize(database.getPreferredSize());
database.setText("");

1
为了避免(我可能的)误解,请在JTextField为空的情况下使用“请键入文本”占位符或图标。 - mKorbel
占位符是什么意思?也许这个答案可以帮到你? - Guillaume Polet
我编写了自己的组件。请参见此处:https://github.com/CollinAlpert/APIs/blob/master/javax/swing/JTextBox.java - Collin Alpert
4个回答

39

试试这个类:

package playground;

import java.awt.*;

import javax.swing.*;
import javax.swing.text.Document;

@SuppressWarnings("serial")
public class PlaceholderTextField extends JTextField {

    public static void main(final String[] args) {
        final PlaceholderTextField tf = new PlaceholderTextField("");
        tf.setColumns(20);
        tf.setPlaceholder("All your base are belong to us!");
        final Font f = tf.getFont();
        tf.setFont(new Font(f.getName(), f.getStyle(), 30));
        JOptionPane.showMessageDialog(null, tf);
    }

    private String placeholder;

    public PlaceholderTextField() {
    }

    public PlaceholderTextField(
        final Document pDoc,
        final String pText,
        final int pColumns)
    {
        super(pDoc, pText, pColumns);
    }

    public PlaceholderTextField(final int pColumns) {
        super(pColumns);
    }

    public PlaceholderTextField(final String pText) {
        super(pText);
    }

    public PlaceholderTextField(final String pText, final int pColumns) {
        super(pText, pColumns);
    }

    public String getPlaceholder() {
        return placeholder;
    }

    @Override
    protected void paintComponent(final Graphics pG) {
        super.paintComponent(pG);

        if (placeholder == null || placeholder.length() == 0 || getText().length() > 0) {
            return;
        }

        final Graphics2D g = (Graphics2D) pG;
        g.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(getDisabledTextColor());
        g.drawString(placeholder, getInsets().left, pG.getFontMetrics()
            .getMaxAscent() + getInsets().top);
    }

    public void setPlaceholder(final String s) {
        placeholder = s;
    }

}

谢谢您的快速回复,亲爱的。 - Renish Khunt
1
我发现占位文本的渲染效果不太理想。根据这个有关文本渲染的SO答案,我添加了静态字段: private static Map<?, ?> hints = (Map<?, ?>) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints"); 然后将设置渲染提示的行更改为 if (hints != null) g.setRenderingHints(hints); else // set them directly as shown in the answer - Javaru

25
JTextField searchText;

在构造函数中:

searchText = new JTextField("Search");
searchText.setForeground(Color.GRAY);
searchText.addFocusListener(new FocusListener() {
    @Override
    public void focusGained(FocusEvent e) {
        if (searchText.getText().equals("Search")) {
            searchText.setText("");
            searchText.setForeground(Color.BLACK);
        }
    }
    @Override
    public void focusLost(FocusEvent e) {
        if (searchText.getText().isEmpty()) {
            searchText.setForeground(Color.GRAY);
            searchText.setText("Search");
        }
    }
    });

3
欢迎来到 Stack Overflow!通过提供一些围绕您的代码的上下文信息,这个答案可以变得更加有用。 - Joe C
当然,如果您输入文本“搜索”,然后再次单击该字段,该文本将消失。 - Jeff Demanche
我喜欢这段代码,但是文本只有在点击框后才可见,我之前也设置了文本来解决这个问题。有更好的方法吗? - Arun Joseph
我们只需要在 searchText = new JTextField("Search"); 下面添加 searchText.setText("..."); 和 searchText.setForeground(Color.GRAY);。 - Didier

11
如此简单,只需使用swingx jar,像这样
JTextArea txtMSISDNList = new JTextArea();  
PromptSupport.setPrompt("01197585960,01197585961", txtMSISDNList);

1
这是一种非常简单的方法。感谢您,朋友。 - Karthikeyan
你是最受欢迎的朋友。 - Mahfuz Ahmed
你的链接已经失效了。你有更新的链接吗? - wanderer0810
2
在这里下载jar文件:http://www.java2s.com/Code/Jar/s/Downloadswingx161jar.htm - Lin
2
不幸的是,swingx已经停止开发了,因此使用时需自行承担风险(甚至不确定它是否与Java 8兼容)。重要提示:无论java2s.com看起来多么可靠,请勿从任何地方下载除原始主页以外的jar文件(否则您永远不知道里面有什么!)。您仍然可以通过maven获取jar文件(请参见右侧的“下载”列)。 - Neph
如果我使用上述解决方案,在 Mac 系统中,我的文本框的背景会变成灰色。 - Vaibhav Jain

10
如果我理解正确,文本提示可以演示一种实现此功能的方法。

谢谢您的快速回复,亲爱的camickr。 - Renish Khunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接