2011-02-18 29 views
7

我正在寻找一种将示例文本放入JTextField的方法,并将其变为灰色。示例文本应该在任何东西输入到该文本字段后立即消失。一些类似于当用户使用标题字段发布问题时的计算器功能。JTextField中的示例文本

如果它已经是JTextField的扩展实现,那么我可以放入它作为一个简单的替换,我想它。任何来自swingx的东西都可以工作。我猜如果没有一个简单的方法来做到这一点,我的选择可能会重写JTextField的paint方法做这样的事情。

感谢

回答

7

Text Prompt类提供所需的功能,而无需使用一个自定义的JTextField。

2

而不是覆盖,把一个价值在该领域,并添加KeyListener当击键被注册,将删除该值。也许它也改变了前景。

你可以将它包装到你自己定制的JTextField类中,该类将采用构造函数中的默认文本。

+0

您不能使用密钥侦听器,因为可以通过其他方法(如复制和粘贴)输入数据。 – 2011-02-18 18:01:05

+0

我实际上不会在值字段中添加此示例文本,因为存在使用getText()检索示例文本的风险 – dm76 2011-02-18 18:01:17

+0

@Hover,我首先想到了焦点侦听器,但在SO标题示例中作为一个例子,OP提到,文本不会在焦点上消失,而是在开始输入时消失。如果你确实允许粘贴添加一个DocumentListener可能是一个更好的解决方案。 – jzd 2011-02-18 19:24:16

1

你不能用纯文本字段来做到这一点,但是你可以在JTextField的顶部放置一个禁用的JLabel,并在文本字段获得焦点时将其隐藏。

5

如果您可以使用外部库,Jide software的Swing组件具有您正在查找的内容;它被称为LabeledTextField(javadoc),它是JIDE公共层(开源项目)的一部分 - 这是免费的。它正在做什么mklhmnn建议。

3

如何使用默认文本初始化文本字段并为其指定焦点侦听器,以便在获得焦点时,如果文本.equals默认文本,则调用JTextField上的selectAll()。

1

做这样的:

  1. 定义你喜欢的初始文本字符串,并设置您的文本字段:

    String initialText = "Enter your initial text here"; 
    jTextField1.setText(initialText); 
    
  2. 添加焦点监听你的文本字段,其中选择TextField的全部内容(如果它仍然具有初始值)。您可以键入的任何内容都会替换整个内容,因为它已被选中。

    jTextField1.addFocusListener(new java.awt.event.FocusAdapter() { 
        public void focusGained(java.awt.event.FocusEvent evt) { 
         if (jTextField1.getText().equals(initialText)) { 
          jTextField1.selectAll(); 
         } 
        } 
    }); 
    
2
private JLabel l; 

JPromptTextField(String prompt) { 
    l = new JLabel(prompt, SwingConstants.CENTER); 
    l.setForeground(Color.GRAY); 
} 

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

    if (this.getText().length() == 0) { 
     // Reshape the label if needed, then paint 

     final Rectangle mine = this.getBounds(); 
     final Rectangle its = l.getBounds(); 
     boolean resized = (mine.width != its.width) || (mine.height != its.height); 
     boolean moved = (mine.x != its.x) || (mine.y != its.y); 
     if (resized || moved) 
      l.setBounds(mine); 

     l.paint(g); 
    } 
}