1

マウスを重ねると背景色が変わる編集不可能なテキスト (JTextField ではない) を作成する方法を見つけようとしています。ActionListener を実装する JButton を使用し、要素を非表示にしてボタンを単なるテキストのように見せようとしましたが、ロールオーバー時にアイコンを変更し、ボタンがクリックされたことを検出することしかできませんでした。もう 1 つの考えは、MouseListener を使用して、テキストを囲む長方形の特定の座標を宣言することでした。これにより、mouseMoved でハイライトを開始できます。しかし、さまざまな文字列の長さやワード ラップなどの問題があります。マウスのロールオーバー時にハイライトされたテキスト フィールドの効果を実現するための最適なオブジェクトとリスナーの組み合わせは何ですか?

4

1 に答える 1

2

うーん、おそらく foucs リスナーを使用し、フィールドが foucs を取得するとすべてのテキストを選択しますか?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TextField extends JTextField {


public TextField(String text) {
    super(text);

    addFocusListener(new FocusAdapter() {

        @Override
        public void focusGained(FocusEvent fe) {
             selectAll();
        }
    });
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        public void run() {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JTextField tf = new JTextField("normal field");
            f.add(tf, BorderLayout.CENTER);

            TextField ftf =
                    new TextField("funny text field");
            f.add(ftf, BorderLayout.SOUTH);

            f.pack();
            f.setVisible(true);
        }
    });
}
}

編集:

うーん、実際には、フォーカスを得るためにテキストフィールドをクリックする必要がある上記の方法でさらに良い方法を見つけました。今、スレッドを使用して、マウスがコンポーネントの座標上にあることを確認し、フィールドを強調表示しました。ブール値を使用して強調表示を制御しました。これは、常に強調表示するとエラーがスローされるためです。これがあなたが望むものであることを願っています:

import java.awt.*;
import javax.swing.*;

public class TextFieldHighlight extends JTextField {

    static JTextField ftf;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


                ftf = new JTextField("Highlight");
                ftf.setEditable(false);
                f.add(ftf, BorderLayout.CENTER);
                f.pack();
                f.setVisible(true);
                Thread thread = new Thread(new Runnable() {

                    boolean focused = false;

                    @Override
                    public void run() {
                        while (true) {
                            if (mouseIsOverDisplayPanel()) {
                                if (ftf.hasFocus() && focused == false) {
                                    ftf.selectAll();
                                    focused = true;
                                } else if (!ftf.hasFocus()) {
                                    focused = false;
                                }
                            }
                        }
                    }
                });
                thread.start();
            }
        });

    }

    private static boolean mouseIsOverDisplayPanel() {

        if (MouseInfo.getPointerInfo().getLocation().x >= ftf.getLocationOnScreen().x
                && MouseInfo.getPointerInfo().getLocation().x <= ftf.getLocationOnScreen().x + ftf.getWidth()
                && MouseInfo.getPointerInfo().getLocation().y >= ftf.getLocationOnScreen().y
                && MouseInfo.getPointerInfo().getLocation().y <= ftf.getLocationOnScreen().y + ftf.getHeight()) {

            return true;

        } else {

            return false;

        }
    }
}
于 2012-06-14T19:33:06.787 に答える