2012-04-06 93 views
0

我想制作一个透明的按钮,直到用户将鼠标移动到它上面为止,所以我创建了自己的类来扩展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) {} 
     }); 
    } 
} 

回答

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); 
    } 
} 
+0

谢谢。这很有道理! – sticks 2012-04-06 08:49:59

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); 

     } 

P.S:我没有测试它。但这似乎在逻辑上显而易见enoguh

1

boolean opaque = false,areaFilled = false,borderPainted = false; 字段不透明,areaFilled和borderPainted是您的会话的局部变量。 改变它不会影响晚餐类!

有大量的逻辑setOpaque,setContentAreaFilled的后面,setBorderPainted方法 你应该使用它

相关问题