带有输入提示的 Java JTextField

标签 java swing input jtextfield hint

我想为我的 javax.swing.JTextField 添加一个提示值。它应该看起来像 <input type="text" title="bla"> 的 Firefox 渲染。 .这将在背景中创建一个带有文本“bla”的编辑字段。如果文本框具有焦点,则标题文本会消失,如果用户离开编辑框而没有文本,则会重新出现。

是否有(免费) Swing 组件可以做这样的事情?

最佳答案

您可以创建自己的:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.*;

public class Main {

  public static void main(String[] args) {

    final JFrame frame = new JFrame();

    frame.setLayout(new BorderLayout());

    final JTextField textFieldA = new HintTextField("A hint here");
    final JTextField textFieldB = new HintTextField("Another hint here");

    frame.add(textFieldA, BorderLayout.NORTH);
    frame.add(textFieldB, BorderLayout.CENTER);
    JButton btnGetText = new JButton("Get text");

    btnGetText.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        String message = String.format("textFieldA='%s', textFieldB='%s'",
            textFieldA.getText(), textFieldB.getText());
        JOptionPane.showMessageDialog(frame, message);
      }
    });

    frame.add(btnGetText, BorderLayout.SOUTH);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.pack();
  }
}

class HintTextField extends JTextField implements FocusListener {

  private final String hint;
  private boolean showingHint;

  public HintTextField(final String hint) {
    super(hint);
    this.hint = hint;
    this.showingHint = true;
    super.addFocusListener(this);
  }

  @Override
  public void focusGained(FocusEvent e) {
    if(this.getText().isEmpty()) {
      super.setText("");
      showingHint = false;
    }
  }
  @Override
  public void focusLost(FocusEvent e) {
    if(this.getText().isEmpty()) {
      super.setText(hint);
      showingHint = true;
    }
  }

  @Override
  public String getText() {
    return showingHint ? "" : super.getText();
  }
}

如果您仍在使用 Java 1.5,请将 this.getText().isEmpty() 替换为 this.getText().length() == 0 .

关于带有输入提示的 Java JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738966/

相关文章:

java - 将 JLabel 添加到 JMenuBar 并使其占用所有可用空间

c++ - 为什么std::getline()在格式化提取后会跳过输入?

c# - C#模拟键盘输入

c++ - 重载输入 (>>) 运算符以获取枚举字符串

java - 如何访问对象中的对象?

java - Java 中用于字符串相等的 println() 方法......以及它是如何工作的?

java - 在Android后台服务中使用php Webservice

java - IBM websphere 8.0 中带有嵌套异常 java.lang.LinkageError 的 BeanCreationException

Java 计算器正在产生正确的输出

java - 无法让 Java2D 将简单的线条渲染到 Graphics 对象