Java - 文本框中的占位符

16

我正在尝试使用Swing创建一个GUI。我的问题是,我有一个文本框,但我希望它具有“占位符”(就像在html中一样)。我在这里和那里读到可以通过重写文本框的paint()方法来实现。

由于我的代码是自动生成的,我发现我需要使用“自定义创建代码”来覆盖生成的代码。

以下是我放置在“自定义创建代码”字段中的内容

new javax.swing.JTextField()
{
    String test = super.getText();
    String hint = "Username";

    public void paint(Graphics g)
    {
        if ( test == null || test.length() < 1 ) {
            g.setColor( Color.red );
            g.drawString(hint, 0, 0);
        }

        g.setColor(Color.BLACK);
        super.paint(g);
    }
}

这将生成以下输出

javax.swing.JTextField username = new javax.swing.JTextField()
{
    String test = super.getText();
    String hint = "Username";

    public void paint(Graphics g)
    {
        if ( test == null || test.length() < 1 ) {
            g.setColor( Color.red );
            g.drawString(hint, 0, 0);
        }

        g.setColor(Color.BLACK);
        super.paint(g);
    }
};

目前我能看到这个文本框,但里面没有任何内容,也许我需要在某个事件上添加一些函数,但我不确定。

如果有人能帮忙就太感激了。

编辑:这是我想做的演示:http://davidwalsh.name/demo/html5-placeholder.php


请参见此重复问题的答案。 - Basil Bourque
3个回答

11

我在oracle论坛上找到了这个。

public class TextFieldWithPrompt extends JTextField{

@Override
protected void paintComponent(java.awt.Graphics g) {
    super.paintComponent(g);

    if(getText().isEmpty() && ! (FocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == this)){
        Graphics2D g2 = (Graphics2D)g.create();
        g2.setBackground(Color.gray);
        g2.setFont(getFont().deriveFont(Font.ITALIC));
        g2.drawString("zip", 5, 10); //figure out x, y from font's FontMetrics and size of component.
        g2.dispose();
    }
  }

https://forums.oracle.com/forums/thread.jspa?threadID=1349874


不错的发现,我会进一步研究它。 - Jordashiro
你提供的链接有效,也许可以再提供一个答案并附上这个链接,这样解决方案就更清晰了。 - Jordashiro

11

我曾经覆盖文本字段的绘制方法,直到我拥有了比我想要的更多自定义文本字段...

然后我发现了这个提示API,它使用起来简单,不需要你扩展任何组件。它还有一个很好的“buddy”API

现在它已经包含在SwingLabs,SwingX库中,使它更容易使用...


1
这实际上是最新的SwingX库的一部分! - MadProgrammer

1
尝试一下。
private void txtUserNameFocusGained(java.awt.event.FocusEvent evt) {                                        
    String username = txtUserName.getText();
    if(username.equals("User Name")){
        txtUserName.setCaretPosition(0);
    }

}                                       

private void txtUserNameFocusLost(java.awt.event.FocusEvent evt) {                                      
    String username = txtUserName.getText();
    if(username.equals("")){
        txtUserName.setForeground(new java.awt.Color(86, 86, 86));
        txtUserName.setCaretPosition(0);
        txtUserName.setText("User Name");
    }
}                                     

private void txtUserNameKeyPressed(java.awt.event.KeyEvent evt) {                                       
    String username = txtUserName.getText();
    if(username.equals("User Name")){
        txtUserName.setForeground(new java.awt.Color(0, 0, 0));
        txtUserName.setText(null);
        txtUserName.setCaretPosition(0);
    }
}

请注意,文本框的名称为“txtUserName”。您可以看到输出结果如下。

image description here


如果我的用户名是“User Name”呢? - Olivier Grégoire
没有问题。它被视为一个名称。 - Panduka Nandara

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