0

我们遇到了一些流行的网站登录屏幕,其中一个淡灰色的用户名写在用户名文本框中。我想知道这可以在java swings中实现吗?

我有理论,由 mouseEvents 实现。无法弄清楚如何去做。

4

2 回答 2

3

单程:

  • 创建一个在启动时提供 JTextField 幻像文本的类
  • 将文本的前景设置为浅色
  • 使用 FocusListener,它将选择所有幻像文本并将前景更改为默认颜色(设置为 null)。

例如:

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;
            }
        }
    }       
}
于 2017-06-18T13:40:27.730 回答
2

查看文本提示

它允许您显示文本和/或图标作为使用文本字段的提示。只要在文本字段中输入任何字符,提示就会被删除。

您还可以控制何时显示提示:

  1. ALWAYS– 无论文本字段是否具有焦点,都会显示提示。
  2. FOCUS_GAINED– 文本框获得焦点时显示提示(失去焦点时隐藏)
  3. FOCUS_LOST– 文本框失去焦点时显示提示(获得焦点时隐藏)
于 2017-06-18T13:56:39.730 回答