2012-05-21 66 views
3

我想在我的程序按鈕上放一些效果。當我按下button,則button應該褪色。是否可以使用Timer爲JButton創建淡入效果?

使用timer改變Opaquenew Color()值的方式之一,但它可以適用於JButton呢?因爲JButton有邊框。

所以,我想問,是否有可能使用Timer創建淡入效果JButton

如果是的話,我可以問一個例子嗎?

回答

9

是否有可能使用定時器爲JButton創建淡入效果?

我認爲這與沒有問題,

如果是的話,我可以問一個例子嗎?

爲什麼不

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.Color; 
import java.awt.AlphaComposite; 
import javax.swing.*; 
import javax.swing.UIManager.LookAndFeelInfo; 

public class ButtonTest { 

    private JFrame frame; 
    private JButton opaqueButton1; 
    private JButton opaqueButton2; 
    private SoftJButton softButton1; 
    private SoftJButton softButton2; 
    private Timer alphaChanger; 

    public void createAndShowGUI() { 
     opaqueButton1 = new JButton("Opaque Button"); 
     opaqueButton2 = new JButton("Opaque Button"); 
     softButton1 = new SoftJButton("Transparent Button"); 
     softButton2 = new SoftJButton("Transparent Button"); 
     opaqueButton1.setBackground(Color.GREEN); 
     softButton1.setBackground(Color.GREEN); 
     frame = new JFrame(); 
     frame.getContentPane().setLayout(new java.awt.GridLayout(2, 2, 10, 10)); 
     frame.add(opaqueButton1); 
     frame.add(softButton1); 
     frame.add(opaqueButton2); 
     frame.add(softButton2); 
     frame.setSize(700, 300); 
     frame.setLocation(150, 100); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     alphaChanger = new Timer(30, new ActionListener() { 

      private float incrementer = -.03f; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       float newAlpha = softButton1.getAlpha() + incrementer; 
       if (newAlpha < 0) { 
        newAlpha = 0; 
        incrementer = -incrementer; 
       } else if (newAlpha > 1f) { 
        newAlpha = 1f; 
        incrementer = -incrementer; 
       } 
       softButton1.setAlpha(newAlpha); 
       softButton2.setAlpha(newAlpha); 
      } 
     }); 
     alphaChanger.start(); 
     Timer uiChanger = new Timer(3500, new ActionListener() { 

      private final LookAndFeelInfo[] laf = UIManager.getInstalledLookAndFeels(); 
      private int index = 1; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        UIManager.setLookAndFeel(laf[index].getClassName()); 
        SwingUtilities.updateComponentTreeUI(frame); 
        opaqueButton1.setText(laf[index].getClassName()); 
        softButton1.setText(laf[index].getClassName()); 
       } catch (Exception exc) { 
        exc.printStackTrace(); 
       } 
       index = (index + 1) % laf.length; 
      } 
     }); 
     uiChanger.start(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ButtonTest().createAndShowGUI(); 
      } 
     }); 
    } 

    private static class SoftJButton extends JButton { 

     private static final JButton lafDeterminer = new JButton(); 
     private static final long serialVersionUID = 1L; 
     private boolean rectangularLAF; 
     private float alpha = 1f; 

     SoftJButton() { 
      this(null, null); 
     } 

     SoftJButton(String text) { 
      this(text, null); 
     } 

     SoftJButton(String text, Icon icon) { 
      super(text, icon); 
      setOpaque(false); 
      setFocusPainted(false); 
     } 

     public float getAlpha() { 
      return alpha; 
     } 

     public void setAlpha(float alpha) { 
      this.alpha = alpha; 
      repaint(); 
     } 

     @Override 
     public void paintComponent(java.awt.Graphics g) { 
      java.awt.Graphics2D g2 = (java.awt.Graphics2D) g; 
      g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); 
      if (rectangularLAF && isBackgroundSet()) { 
       Color c = getBackground(); 
       g2.setColor(c); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
      super.paintComponent(g2); 
     } 

     @Override 
     public void updateUI() { 
      super.updateUI(); 
      lafDeterminer.updateUI(); 
      rectangularLAF = lafDeterminer.isOpaque(); 
     } 
    } 
} 
+0

您的代碼似乎太複雜了,我的水平... @ _ @但我會嘗試它。謝謝回覆。 – Chin

+0

@AnonyNewbie:比較這個相關的[示例](http://stackoverflow.com/a/2234020/230513)。 – trashgod

2

是的,這應該是可能的。您可以指定顏色RGBA,其中A是alpha(或不透明度),然後將此顏色(或具有相同alpha值的單獨顏色,如果願意的話)應用於邊框,背景和前景或JButton 。

button.setForeground(*colour*); 
button.setBackground(*colour*); 
button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, *highlight colour*, *shadow colour*)); 
+0

我明白'setForeground()'和'setBackground()',但我不太瞭解提到的'setBorder()'。 '*突出顏色*'和'*陰影顏色*'是什麼意思? – Chin

+0

我們正在創建一個新的斜面邊框以應用於按鈕。斜面邊框不僅僅是一種顏色,實際上也是兩種 - 高光顏色和陰影顏色。這些用於繪製邊界的「斜面」邊緣。他們可以是任何你喜歡的顏色,只要確保你適當地調整阿爾法值! – Jamie

+0

那麼,我可以使用'新顏色(123,123,123,50)'來代替'*高亮顏色*'和'*陰影顏色*'嗎? – Chin

相關問題