jTextField 中的 Fantom 文本。如何?
Fantom-text in jTextField. How?
我们遇到过一些流行网站的登录屏幕,其中在用户名文本框中写有一个淡灰色的用户名。我想知道这可以在 java swings 中实现吗?
I have theories, implementing by mouseEvents. Couldn't figure out how to to.
一种方式:
- 创建一个 class 在启动时提供 JTextField 幻像文本
- 将文本的前景设置为浅色
- 使用 FocusListener,它会 select 所有幻像文本并将前景更改为默认颜色(设置为空)。
例如:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class FantomTextFieldTest extends JPanel {
FantomTextField fantomTextField = new FantomTextField("Fantom Text");
public FantomTextFieldTest() {
setLayout(new GridLayout(1, 0, 5, 0));
add(new JTextField(20));
add(fantomTextField.getTextField());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private static void createAndShowGui() {
FantomTextFieldTest mainPanel = new FantomTextFieldTest();
JFrame frame = new JFrame("FantomTextFieldTest");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
}
class FantomTextField {
private static final Color FANTOM_FG = new Color(150, 150, 150, 150);
private JTextField textField;
private String fantomText;
private boolean showFantomText = true;
public FantomTextField(String fantomText) {
this.fantomText = fantomText;
textField = new JTextField();
textField.setText(fantomText);
textField.setForeground(FANTOM_FG);
textField.addFocusListener(new FtfFocusListener());
}
public FantomTextField(String fantomText, int columns) {
this(fantomText);
textField.setColumns(columns);
}
public JTextField getTextField() {
return textField;
}
public String getFantomText() {
return fantomText;
}
public void setFantomText(String fantomText) {
this.fantomText = fantomText;
textField.setText(fantomText);
textField.setForeground(FANTOM_FG);
showFantomText = true;
}
private class FtfFocusListener extends FocusAdapter {
@Override
public void focusGained(FocusEvent e) {
if (showFantomText) {
textField.selectAll();
textField.setForeground(null);
showFantomText = false;
}
}
}
}
查看 Text Prompt。
它允许您显示文本 and/or 图标作为使用文本字段的提示。只要在文本字段中输入任何字符,提示就会被删除。
您还可以控制何时显示提示:
ALWAYS
– 提示文本域是否有焦点。
FOCUS_GAINED
– 文本框获得焦点时显示提示(失去焦点时隐藏)
FOCUS_LOST
– 当文本字段失去焦点时显示提示(并在获得焦点时隐藏)
我们遇到过一些流行网站的登录屏幕,其中在用户名文本框中写有一个淡灰色的用户名。我想知道这可以在 java swings 中实现吗?
I have theories, implementing by mouseEvents. Couldn't figure out how to to.
一种方式:
- 创建一个 class 在启动时提供 JTextField 幻像文本
- 将文本的前景设置为浅色
- 使用 FocusListener,它会 select 所有幻像文本并将前景更改为默认颜色(设置为空)。
例如:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class FantomTextFieldTest extends JPanel {
FantomTextField fantomTextField = new FantomTextField("Fantom Text");
public FantomTextFieldTest() {
setLayout(new GridLayout(1, 0, 5, 0));
add(new JTextField(20));
add(fantomTextField.getTextField());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private static void createAndShowGui() {
FantomTextFieldTest mainPanel = new FantomTextFieldTest();
JFrame frame = new JFrame("FantomTextFieldTest");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
}
class FantomTextField {
private static final Color FANTOM_FG = new Color(150, 150, 150, 150);
private JTextField textField;
private String fantomText;
private boolean showFantomText = true;
public FantomTextField(String fantomText) {
this.fantomText = fantomText;
textField = new JTextField();
textField.setText(fantomText);
textField.setForeground(FANTOM_FG);
textField.addFocusListener(new FtfFocusListener());
}
public FantomTextField(String fantomText, int columns) {
this(fantomText);
textField.setColumns(columns);
}
public JTextField getTextField() {
return textField;
}
public String getFantomText() {
return fantomText;
}
public void setFantomText(String fantomText) {
this.fantomText = fantomText;
textField.setText(fantomText);
textField.setForeground(FANTOM_FG);
showFantomText = true;
}
private class FtfFocusListener extends FocusAdapter {
@Override
public void focusGained(FocusEvent e) {
if (showFantomText) {
textField.selectAll();
textField.setForeground(null);
showFantomText = false;
}
}
}
}
查看 Text Prompt。
它允许您显示文本 and/or 图标作为使用文本字段的提示。只要在文本字段中输入任何字符,提示就会被删除。
您还可以控制何时显示提示:
ALWAYS
– 提示文本域是否有焦点。FOCUS_GAINED
– 文本框获得焦点时显示提示(失去焦点时隐藏)FOCUS_LOST
– 当文本字段失去焦点时显示提示(并在获得焦点时隐藏)