16

Swing で GUI を作成しようとしています。私の問題は、テキストフィールドがありますが、「プレースホルダー」(html のように) が必要です。textfield の paint() をオーバーライドすることでできることをあちこちで読みました。

私のコードが生成されたので、「カスタム作成コード」を使用して、生成されたコードをオーバーライドする必要があることがわかりました。

「カスタム作成コード」フィールドに入力したものは次のとおりです

new javax.swing.JTextField()
{
    String test = super.getText();
    String hint = "Username";

    public void paint(Graphics g)
    {
        if ( test == null || test.length() < 1 ) {
            g.setColor( Color.red );
            g.drawString(hint, 0, 0);
        }

        g.setColor(Color.BLACK);
        super.paint(g);
    }
}

これにより、次の出力が生成されます

javax.swing.JTextField username = new javax.swing.JTextField()
{
    String test = super.getText();
    String hint = "Username";

    public void paint(Graphics g)
    {
        if ( test == null || test.length() < 1 ) {
            g.setColor( Color.red );
            g.drawString(hint, 0, 0);
        }

        g.setColor(Color.BLACK);
        super.paint(g);
    }
};

今のところ、textField が表示されていますが、そこには何もありません。イベントに関数を追加する必要があるかもしれませんが、よくわかりません。

どなたか手を貸していただけると助かります。

編集:これが私がやりたいことのデモです:http://davidwalsh.name/demo/html5-placeholder.php

4

3 に答える 3

11

私はテキスト フィールドのペイント メソッドをオーバーライドしていましたが、実際に必要以上のカスタム テキスト フィールドができてしまいました...

次に、使いやすく、コンポーネントを拡張する必要がないこのプロンプト APIを見つけました。また、素敵な「相棒」API も備えています。

これは、SwingLabs のSwingX ライブラリに含まれるようになり、さらに使いやすくなりました...

于 2012-10-23T18:22:25.570 に答える
10

これはオラクルフォーラムで見つけました。

public class TextFieldWithPrompt extends JTextField{

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

    if(getText().isEmpty() && ! (FocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == this)){
        Graphics2D g2 = (Graphics2D)g.create();
        g2.setBackground(Color.gray);
        g2.setFont(getFont().deriveFont(Font.ITALIC));
        g2.drawString("zip", 5, 10); //figure out x, y from font's FontMetrics and size of component.
        g2.dispose();
    }
  }

https://forums.oracle.com/forums/thread.jspa?threadID=1349874

于 2012-10-23T15:17:49.487 に答える