JButton 子类不改变透明度



我想制作一个透明的按钮,直到用户将鼠标悬停在它上面,所以我创建了自己的类来扩展 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) {}
        });
    }
}
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);
    }
}
布尔不透明 = 假,

areaFill = 假, borderPainted = 假;字段不透明、区域填充和边框绘制是小腿的局部变量。更改它不会影响晚餐课!

setOpaque,setContentAreaFill和setBorderPaint方法背后有很多逻辑你应该使用它

  • 对于您的代码,您必须添加MouseMotionListener,但最好是ChangeListener

  • 在鼠标/更改事件中,您必须更改 AlphaComposite 的值

设置变量是不够的。还必须在按钮上调用相应的方法:

        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:我没有测试它。但这在逻辑上似乎是显而易见的 enoguh

最新更新