JTextField中的示例文本

时间:2011-02-18 17:40:27

标签: java swing jtextfield

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

我想它,如果它已经是JTextField的扩展实现,那么我可以将它作为一个简单的替换放入。来自swingx的任何东西都可行。我想如果没有一种简单的方法可以做到这一点,我的选择可能是覆盖JTextField的paint方法,也许这样做。

由于

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分: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);
    }
}

答案 5 :(得分:1)

您无法使用纯文本字段执行此操作,但您可以将已禁用的JLabel置于JTextField之上,并在文本字段获得焦点时将其隐藏。

答案 6 :(得分:1)

这样做:

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