Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JTextFieldに透かし文字を入れるには?

JTextFieldに透かし文字を入れたいと思い、ネット検索でサンプルコードを見つけてコードを組み込んでみたのですが、現状ではJTextFieldに「大会名を入力してください」という文字は表示されるのですが透かし文字ではないですし、JTextField内にカーソルを置いてみても無反応な状態です。
基礎的なことで申し訳ありませんが、どうか教えて下さい。
よろしくお願いします。

以下はコードです。
public class RallyInfomationP extends JPanel {
    
    private JLabel jLabel1;
    private JTextField jTextField0 = new JTextField("大会名を入力してください");
    
    public RallyInfomationP() {
        initComponents();
    }

    private void initComponents() {
        setBorder(BorderFactory.createTitledBorder(new LineBorder(new Color(0,128,0), 2, true), "大会情報", TitledBorder.LEFT, TitledBorder.TOP, new Font("Dialog",
                Font.BOLD, 16), new Color(0,128,0)));
        setLayout(new GroupLayout());
        
        add(getJTextField0(), new Constraints(new Leading(60, 158, 12, 12), new Leading(5, 30, 12, 12)));
        
        add(getJLabel1(), new Constraints(new Leading(7, 12, 12), new Leading(7, 12, 12)));

        setSize(232, 198);
    }
    
    //大会名のテキストフィールド
    private JTextField getJTextField0() {
        if (jTextField0 == null) {
            jTextField0 = new JTextField();
            jTextField0.setFont(new Font("Dialog", Font.PLAIN, 16));
            jTextField0.setText("");
            jTextField0.setForeground(Color.BLACK);
            //以下のコードがリスナー
            jTextField0.addFocusListener(new PlaceholderFocusListener(jTextField0));
        }
        return jTextField0;
    }

    //大会名のラベル
    private JLabel getJLabel1() {
        if (jLabel1 == null) {
            jLabel1 = new JLabel();
            jLabel1.setFont(new Font("Dialog", Font.BOLD, 18));
            jLabel1.setText("大会名");
        }
        return jLabel1;
    }

}

//---2012.09.21---透かし文字を入れるためのリスナー
class PlaceholderFocusListener implements FocusListener {
    private static final Color INACTIVE = UIManager.getColor("TextField.inactiveForeground");
    private final String hintMessage;
    public PlaceholderFocusListener(JTextComponent tf) {
        hintMessage = tf.getText();
        tf.setForeground(INACTIVE);
    }
    @Override public void focusGained(FocusEvent e) {
        JTextComponent tf = (JTextComponent)e.getSource();
        if(hintMessage.equals(tf.getText()) && INACTIVE.equals(tf.getForeground())) {
            tf.setForeground(UIManager.getColor("TextField.foreground"));
            tf.setText("");
        }
    }
    @Override public void focusLost(FocusEvent e) {
        JTextComponent tf = (JTextComponent)e.getSource();
        if("".equals(tf.getText().trim())) {
            tf.setForeground(INACTIVE);
            tf.setText(hintMessage);
        }
    }
}

6

回答

95072

閲覧

6件の回答

評価

0

丸投げせずに、まずは自力でデバッグする。
何を言ってるのか分からない、または言ってることは判るが
何をすればいいのか分からないというなら、
Swingはいったん脇へ置いて基礎から勉強し直す。

評価

0

$さん、回答ありがとうございます。
ブレークポイントを設置してデバッグしてみましたが原因が掴めません。

また、$さんにはいつも「基礎から勉強し直す」よう指摘されていますが基礎本を読んでいないわけではなく、常に机の脇に置き必要に応じて読み直したりもしていて独力で出来るよう努力しています。

習得が牛歩のごとく遅いのは認めますが、周囲に教えてもらえる方がいない環境での独学なのでこれが精一杯です。

今回の件は「PlaceholderFocusListener」をどこに記述するかが問題なような気がするんですが、どこをどう対処したらよいのかわからないんです。

ですから基礎のどこをやり直したら上記問題が解決するのかを教えて下さい。 

評価

0

書かれたコードの1行1行がどういう意味か
理解していますか?という意味だと思います。

デバッガを使った開発というのは、
本来自分が意図した条件分岐や変数の中身などが
期待通りに動作しているかを確認するために使うのです。

ざっと見た感じ、コードの
//以下のコードがリスナー
jTextField0.addFocusListener(new PlaceholderFocusListener(jTextField0));

はインスタンス変数「jTextField0」を宣言時に初期化しているため
実行時に通らなそうですが、ここにブレークポイントを仕掛けるとどうなりますか?

「このメソッドの呼び出しが発生すれば、こう動くはず」という考えがしっかりしていれば
デバッガは有効なツールとなりますので、がんばってください。

評価

0

匿名さん、回答ありがとうございます。

その後以下の行にブレークポイントを置いてデバッグを行ったんですが、
jTextField0.addFocusListener(new PlaceholderFocusListener(jTextField0));

「ソースが見つかりません。」と出てその下に「ソース・ルックアップの編集」ボタンが出現します。

ネット検索で調べてみるとTomcat関係ばかりで解決方法を見つけることが出来ませんでした。

どう対処したら良いのでしょうか?
お知らせください。

評価

0

どうも、先日の匿名です。
Eclipseのトラブルは環境や設定等々、色々な原因があるので
正直回答しようがありません。
試すこととしては、

・プロジェクトを右クリックして「リフレッシュ」してみる
・ソースフォルダ設定が正しいかどうか確認する
・実行クラスパス上に同一パッケージ同一クラスが複数存在しないか確認する
・Javaビルドパス設定に不要なプロジェクトが無いか確認する

とかでしょうか。
あとは、
$さんへの回答で「デバッグを試してみた」旨が書かれてるので、
そのブレークポイントからステップ実行させてみるとか

評価

0

遅くなりましたが解決しました。

以下のPlaceholderFocusListenerをクラス内クラスとし、

private static final Color INACTIVE = UIManager.getColor("TextField.inactiveForeground");を

private Color INACTIVE = Color.LIGHT_GRAY;

と変更することで解決しました。

回答して下さった皆さん、ありがとうございました。

以下が改変したコードです。
public class PlaceholderFocusListener implements FocusListener{
    
    private Color INACTIVE = Color.LIGHT_GRAY;

    private final String hintMessage;
    
    public PlaceholderFocusListener(JTextComponent tf) {
        
        hintMessage = tf.getText();
        tf.setForeground(INACTIVE);
    }
    
    @Override
    public void focusGained(FocusEvent e) {
        
        JTextComponent tf = (JTextComponent)e.getSource();
        
        if(hintMessage.equals(tf.getText()) && INACTIVE.equals(tf.getForeground())) {
            tf.setForeground(UIManager.getColor("TextField.foreground"));
            tf.setText("");
        }
    }
    
    @Override
    public void focusLost(FocusEvent e) {
        
        JTextComponent tf = (JTextComponent)e.getSource();
        
        if("".equals(tf.getText().trim())) {
            tf.setForeground(INACTIVE);
            tf.setText(hintMessage);
        }
    }
}

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。