2017-05-16 14 views
0

当我从组件中单击时,如何将文本设置为JTextField? 每当我点击它,它会清除这样的文字:如何在单击外部时将TextText设置为JTextField?

// Clears the "Enter text here..." when clicked 
    commandLine.addMouseListener(new MouseAdapter(){ 
     @Override 
     public void mouseClicked(MouseEvent e){ 
      commandLine.setText(""); 
     } 
    }); 

但是,当我点击关闭文本框,我怎么能恢复呢? 我试过FocusEvent,但没有按照我的要求工作。

+0

你想实现一个占位符? – Ollaw

+0

我不知道这意味着什么,我正试图让JTextField在这里写入“输入消息......”,但是当您单击JTextField时,消息将消失。点击后,同样的消息将再次出现在那里。 – Timppa

+0

好的,这是一个占位符。如果您输入一些文字,示例文字应该保留吗? – Ollaw

回答

1

我想你只需要将FocusListener添加到textField。这里有一门我写的课程,可以按你的意愿工作。

class CustomPlaceholderTextField extends JTextField implements FocusListener { 

private static final long serialVersionUID = 1L; 
private boolean changedText = false; 
private final String placeholder; 


public CustomPlaceholderTextField(String placeholder){ 
    super(); 
    this.placeholder = Objects.requireNonNull(placeholder); 
    this.addFocusListener(this); 
    super.setText(placeholder); 

} 

@Override 
public String getText() { 
    if (this.changedText) { 
     return super.getText(); 
    } else { 
     return ""; 
    } 
} 

@Override 
public void setText(String t) { 
    if (t == null || t.isEmpty()) { 
     super.setText(this.placeholder); 
     this.changedText = false; 
    } else { 
     super.setText(t); 
     this.changedText = true; 
    } 
} 

@Override 
public void focusGained(FocusEvent e) { 
    if (!this.changedText) { 
     super.setText(""); 
     this.changedText = true; 
    } 
} 

@Override 
public void focusLost(FocusEvent e) { 
    if (this.getText().isEmpty()) { 
     super.setText(this.placeholder); 
     this.changedText = false; 
    } else { 
     this.changedText = true; 
    } 
} 

}

+0

看起来很酷,有没有办法像commandLine.FocusEvent一样添加?像我不需要创建任何不同的类,只是一个小方法? – Timppa

+0

问题是我用WindowBuilder创建了我的GUi(在NetBeans中),所以我不能真正编辑该脚本,除非我去属性并在那里编辑,所以我宁愿使用一些方法。 – Timppa

+0

只需将FocusListener添加到您的textField并按需要实现focusGained()和focusLost(),就像我一样 – Ollaw

相关问题