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