0

ユーザーがマウスでホバーするまで透明なボタンを作成したかったので、JButton を拡張する独自のクラスを作成しました。私はそれをテストしましたが、ボタンを透明にし、ユーザーがその上にホバーしたことを検出しますが、その後は不透明になりません。このコードで何を変更する必要がありますか?

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

public class TransparentButton extends JButton {

    boolean opaque = false, areaFilled = false, borderPainted = false;

    public TransparentButton(Icon icon) {
        super(icon);
        initialise();
    }

    public TransparentButton(String text) {
        super(text);
        initialise();
    }

    private void initialise() {
        super.setOpaque(opaque);
        super.setContentAreaFilled(areaFilled);
        super.setBorderPainted(borderPainted);
        super.addMouseListener(new MouseListener() {
            public void mouseEntered(MouseEvent e) {
                opaque = true;
                areaFilled = true;
                borderPainted = true;
            }

            public void mouseExited(MouseEvent e) {
                opaque = false;
                areaFilled = false;
                borderPainted = false;
            }

            public void mouseClicked(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}
        });
    }
}
4

4 に答える 4

1

ブール不透明=false、areaFilled = false、borderPainted = false; フィールドopaque、areaFilled、borderPaintedは、calsのローカル変数です。変更しても夕食クラスには影響しません!

setOpaque、setContentAreaFilled、setBorderPaintedメソッドの背後には多くのロジックがあります。

于 2012-04-06T08:01:43.810 に答える
1
于 2012-04-06T08:10:51.933 に答える
1
import javax.swing.*;
import java.awt.event.*;

public class TransparentButton extends JButton {

    boolean opaque = false, areaFilled = false, borderPainted = false;

    public TransparentButton(Icon icon) {
        super(icon);
        initialise();
    }

    public TransparentButton(String text) {
        super(text);
        initialise();
    }

    private void initialise() {

        super.addMouseListener(new MouseListener() {
            public void mouseEntered(MouseEvent e) {
                opaque = true;
                areaFilled = true;
                borderPainted = true;
                reset();

            }

            public void mouseExited(MouseEvent e) {
                opaque = false;
                areaFilled = false;
                borderPainted = false;
                reset();
            }

            public void mouseClicked(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}
        });
    }

    private void reset() {
        super.setOpaque(opaque);
        super.setContentAreaFilled(areaFilled);
        super.setBorderPainted(borderPainted);
    }
}
于 2012-04-06T07:52:50.210 に答える
0

変数を設定するだけでは不十分です。ボタンでも適切なメソッドを呼び出す必要があります。

        public void mouseEntered(MouseEvent e) {
                super.setOpaque(true);
                super.setContentAreaFilled(true);
                super.setBorderPainted(true);

        }

        public void mouseExited(MouseEvent e) {
                super.setOpaque(false);
                super.setContentAreaFilled(false);
                super.setBorderPainted(false);

        }

PS:私はそれをテストしませんでした。しかし、これは論理的に明らかなエノグのようです

于 2012-04-06T07:47:53.233 に答える