我正在寻找一种方法,可以在swing JTextField中放置示例文本并使其变灰。只要在该文本字段中输入任何内容,示例文本就应该会消失。与stackoverflow在用户发布标题字段的问题时所做的操作有些相似。
如果它已经是JTextField的扩展实现,那将很好,这样我就可以轻松地用它来替换原有的文本字段。来自swingx的任何内容都可以使用。如果没有简单的方法来完成此操作,我的选项可能就是覆盖JTextField的paint方法,以便以这种方式进行操作。
谢谢
我正在寻找一种方法,可以在swing JTextField中放置示例文本并使其变灰。只要在该文本字段中输入任何内容,示例文本就应该会消失。与stackoverflow在用户发布标题字段的问题时所做的操作有些相似。
如果它已经是JTextField的扩展实现,那将很好,这样我就可以轻松地用它来替换原有的文本字段。来自swingx的任何内容都可以使用。如果没有简单的方法来完成此操作,我的选项可能就是覆盖JTextField的paint方法,以便以这种方式进行操作。
谢谢
文本提示类提供所需功能,无需使用自定义的JTextField。
它允许您指定在文本字段为空时显示的提示。一旦输入文本,提示将被删除。
提示实际上是一个JLabel
,因此您可以自定义字体、样式、颜色、透明度等:
JTextField tf7 = new JTextField(10);
TextPrompt tp7 = new TextPrompt("First Name", tf7);
tp7.setForeground( Color.RED );
如何使用默认文本初始化文本字段,并添加焦点监听器,使得当焦点被获取时,如果文本等于默认文本,则在JTextField上调用selectAll()方法。
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);
}
}
像这样做:
定义一个字符串并设置为你喜欢的初始文本,然后设置你的TextField:
String initialText = "在此输入初始文本";
jTextField1.setText(initialText);
为你的TextField添加一个焦点监听器,如果它仍然有初始值,就选择整个内容。任何你输入的内容都会替换掉整个内容,因为它被选中了。
jTextField1.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
if (jTextField1.getText().equals(initialText)) {
jTextField1.selectAll();
}
}
});
你不能使用普通文本字段来实现这个功能,但是你可以在 JTextField
上方放置一个禁用的 JLabel
,并在文本字段获得焦点时隐藏它。