如何修改JTextField(Swing)以显示在用户输入文本之前不会消失的提示?

时间:2013-11-30 14:23:46

标签: java swing jtextfield prompt

好的,要清楚,我知道如何扩展JTextField以保存当用户将光标放在框中时消失的提示。

我想进一步扩展(或编辑)这个。首先,提示显示为深灰色。当用户将光标放在框中时,提示会保留在那里,但会变为浅灰色。如果用户键入任何内容,则提示消失,文本变为黑色。如果用户清除其输入,则提示将返回相同的浅灰色。如果用户从字段中删除光标,则文本保持不变,颜色保持不变,除非字段现在为空(提示除外),这会导致颜色变为深灰色。

这里的问题有两个:1-我是Java和UI应用程序的新手,我找不到在用户输入文本时激活的监听器(InputMethodListener不按我想要的方式工作,或者我无法弄清楚如何正确使用它)。 2-我不希望提示可以选择。假设提示是“提示”,那么如果用户选择框,并在'i'和'n'之间按下鼠标,那么光标应该出现在'H'之前。

这是界面:

public HintTextField extends JTextField implements FocusListener {
    public HintTextField(String hint) {}
    @Override
    public void focusGained(FocusEvent e) {} //change color
    @Override
    public void focusLost(FocusEvent e) {} //change color to darker gray if only hint left in text field
    public void textGained() {} //remove hint, only display text, change color to black. if all text removed, show hint, change color to light gray
}

2 个答案:

答案 0 :(得分:3)

Text Prompt类有不同的选项,可以让你做到你想要的。

答案 1 :(得分:2)

要检测用户何时输入字段,您需要textField.getDocument().addDocumentListener

我能想到显示无法在启用的文本组件中选择的文本的唯一方法是直接绘制它:

private String hintText = "Hint";

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    if (getDocument().getLength() == 0) {

        Rectangle viewBounds = new Rectangle();
        SwingUtilities.calculateInnerArea(this, viewBounds);

        Insets margin = getMargin();
        viewBounds.x += margin.left;
        viewBounds.y += margin.top;
        viewBounds.width -= (margin.left + margin.right);
        viewBounds.height -= (margin.top + margin.bottom);

        Rectangle iconBounds = new Rectangle();
        Rectangle textBounds = new Rectangle();

        SwingUtilities.layoutCompoundLabel(this,
            g.getFontMetrics(), hintText, null,
            CENTER, getHorizontalAlignment(), CENTER, LEADING,
            viewBounds, iconBounds, textBounds, 0);

        // paintComponent must leave its Graphics argument unchanged.
        Color originalColor = g.getColor();

        g.setColor(Color.LIGHT_GRAY);
        g.drawString(hintText,
            textBounds.x, getBaseline(getWidth(), getHeight()));

        g.setColor(originalColor);
    }
}