我正在寻找一种方法将示例文本放入swing JTextField并使其变灰。只要在该文本字段中输入任何内容,示例文本就会消失。有些类似于stackoverflow在用户使用title字段发布问题时所执行的操作。
我想它,如果它已经是JTextField的扩展实现,那么我可以将它作为一个简单的替换放入。来自swingx的任何东西都可行。我想如果没有一种简单的方法可以做到这一点,我的选择可能是覆盖JTextField的paint方法,也许这样做。
由于
答案 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)
这样做:
使用您喜欢的初始文本定义字符串并设置TextField:
String initialText = "Enter your initial text here";
jTextField1.setText(initialText);
向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();
}
}
});