JTextField中的示例文本

我正在寻找一种方法将示例文本放入swing JTextField并使其变灰。 只要在该文本字段中输入任何内容,示例文本就会消失。 有些类似于stackoverflow在用户使用title字段发布问题时所执行的操作。

我想它,如果它已经是JTextField的扩展实现,所以我可以把它作为一个简单的替代品放入。 来自swingx的任何东西都可行。 我想如果没有一个简单的方法来做到这一点,我的选择可能是覆盖JTextField的paint方法做某事可能。

谢谢

Text Prompt类在不使用自定义JTextField的情况下提供所需的function。

如果您可以使用外部库,Jide 软件中的Swing组件可以满足您的需求; 它叫做LabeledTextField( javadoc ),它是JIDE Common Layer(开源项目)的一部分 – 它是免费的。 它正在做mklhmnn建议的事情。

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

而不是覆盖,而是在字段中放置一个值并添加一个KeyListener ,它将在注册键击时删除该值。 也许它也改变了前景。

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

 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); } } 

您不能使用纯文本字段执行此操作,但是您可以将禁用的JLabel放在JTextField顶部,并在文本字段获得焦点时隐藏它。

像这样做:

  1. 使用您喜欢的初始文本定义字符串并设置TextField:

     String initialText = "Enter your initial text here"; jTextField1.setText(initialText); 
  2. 向TextField添加Focus Listener,如果TextField仍具有初始值,则会选择TextField的全部内容。 您输入的任何内容都将替换整个内容,因为它已被选中。

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