2012-04-06 7 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

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

ブール不透明=偽、areaFilledは=偽、borderPainted = falseは、 フィールドopaque、areaFilledおよびborderPaintedは、あなたのカルスのローカル変数です。 それを変更しても、夕食のクラスには影響しません!

あなたがMouseMotionListenerを追加する必要があなたのコードのためにそれを

1
  • を使用する必要がありますが、より良いマウスのChangeListener

  • だろう setOpaque、setContentAreaFilledの背後にあるロジックの多くとsetBorderPainted方法があります/変更イベントの値を変更する必要がありますAlphaComposite

関連する問題