当前位置: 首页 > 面试题库 >

如何在JTextField中显示灰色的“幽灵文本”?

潘胤
2023-03-14
问题内容

我不知道它的名字是否正确,但是我想看看是否有一种特定的方法来实现文本字段,以便当它没有焦点且为空时,出现一个淡淡的灰色字符串文本显示在该字段中。单击该字段时,文本应该消失,就像StackOverflow之类的搜索栏的工作方式一样。我知道我可以更改使用方法setForeground()和焦点侦听器来完成此操作,但是我只是想知道是否有人知道某些Java实现可以帮助我解决此问题。


问题答案:

对于它的价值,我发现实际实现它很有趣,因此我想与您分享(我不是在寻求投票)。

这真的是非侵入性的,因为您要做的就是致电new GhostText(textField, "Please enter some text here...");。剩下的代码只是使它运行。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Test {

    public static class GhostText implements FocusListener, DocumentListener, PropertyChangeListener {
        private final JTextField textfield;
        private boolean isEmpty;
        private Color ghostColor;
        private Color foregroundColor;
        private final String ghostText;

        protected GhostText(final JTextField textfield, String ghostText) {
            super();
            this.textfield = textfield;
            this.ghostText = ghostText;
            this.ghostColor = Color.LIGHT_GRAY;
            textfield.addFocusListener(this);
            registerListeners();
            updateState();
            if (!this.textfield.hasFocus()) {
                focusLost(null);
            }
        }

        public void delete() {
            unregisterListeners();
            textfield.removeFocusListener(this);
        }

        private void registerListeners() {
            textfield.getDocument().addDocumentListener(this);
            textfield.addPropertyChangeListener("foreground", this);
        }

        private void unregisterListeners() {
            textfield.getDocument().removeDocumentListener(this);
            textfield.removePropertyChangeListener("foreground", this);
        }

        public Color getGhostColor() {
            return ghostColor;
        }

        public void setGhostColor(Color ghostColor) {
            this.ghostColor = ghostColor;
        }

        private void updateState() {
            isEmpty = textfield.getText().length() == 0;
            foregroundColor = textfield.getForeground();
        }

        @Override
        public void focusGained(FocusEvent e) {
            if (isEmpty) {
                unregisterListeners();
                try {
                    textfield.setText("");
                    textfield.setForeground(foregroundColor);
                } finally {
                    registerListeners();
                }
            }

        }

        @Override
        public void focusLost(FocusEvent e) {
            if (isEmpty) {
                unregisterListeners();
                try {
                    textfield.setText(ghostText);
                    textfield.setForeground(ghostColor);
                } finally {
                    registerListeners();
                }
            }
        }

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            updateState();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            updateState();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            updateState();
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            updateState();
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                init();
            }
        });
    }

    public static void init() {
        JFrame frame = new JFrame("Test ghost text");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        JTextField textField = new JTextField();
        JButton button = new JButton("Grab focus");
        GhostText ghostText = new GhostText(textField, "Please enter some text here...");
        textField.setPreferredSize(new Dimension(300, 24));
        panel.add(textField);
        panel.add(button);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        button.grabFocus();
    }
}


 类似资料:
  • 我试图创建一个文本视图(黑色),其中包含数字1到7(每个数字位于每个灰色矩形的顶部和中心),但不幸的是,根据我的代码atm,这些数字似乎聚集在一起。如何解决这个问题? 还可以使用字符串中的字符串资源。用于数字1到7的xml文件,而不是使用? 期望成果 当前不希望的结果 更新

  • 有人有过这个问题吗?我正在制作一个android应用程序,我在textview中的文本是浅灰色的。这不是很明显,但这就是我想要的效果。当我看我的模拟器时,它很好,但当我将应用程序上传到我的android设备时,文本被更正,现在显示为带黑色轮廓的白色。我不要这个。我想要浅灰色的。。。 以下是完整布局的实际代码:

  • 我正在开发(NASM GCC针对ELF64)一个PoC,它使用一个spectre小工具来测量访问一组缓存行(刷新重载)的时间。 如何制作可靠的幽灵小工具? 我相信我理解刷新重装技术背后的理论,然而在实践中,我鄙视一些噪音,我无法产生一个工作的概念验证。 由于我使用的是时间戳计数器,并且负载非常规则,因此我使用此脚本来禁用预取器,涡轮增压并修复/稳定CPU频率: 我有一个连续的缓冲区,在4KiB上对

  • 我正在膨胀一个自定义布局与CardView内的布局。圆角显示如预期,但我也得到灰色背景后面的角落。 代码很简单,使用带有角半径和背景颜色的CardView。我试过设置透明背景,但不起作用。但是,如果我设置了另一种不透明颜色,则显示在角落中。 代码已附上。 结果:

  • 我有一部运行Android2.3.6的LG-E405手机。 我用USB线连接手机,并将模式选择为“仅充电”。 现在,当我尝试打开USB调试时,我发现该选项变灰了。 那么,在这种情况下如何启用USB调试呢。

  • 我一直在尝试使用pygame来显示游戏场景,但它似乎已经停止了对我的工作:在pygame关闭之前,它只在我创建的任何屏幕上显示一个灰色框,然后屏幕上应该显示的内容在退出之前短暂闪烁。例如,下面的最小代码显示灰色屏幕5秒钟,然后快速闪烁黑色并退出: 这似乎是屏幕显示的问题,而不是pygame本身的问题,因为我可以使用pg.image制作曲面并将其保存到图像文件中。save(),它们在那里看起来很好。