2012-09-21 34 views
3

我知道我可以淡入面板,通过将alpha值添加到背景颜色&一个计时器。但是,我怎样才能淡入带有子组件的面板(如JLabel)?我如何淡入JPanel和儿童?

EDIT

_fadeTimer = new Timer(40, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (_alpha == 255) { 
       _fadeTimer.stop(); 
      } else { 
       pnl_hint.setBackground(new Color(
         bgColor.getRed(), 
         bgColor.getGreen(), 
         bgColor.getBlue(), 
         (_alpha += 1))); 

       pnl_hint.updateUI(); 
      } 
     } 
    }); 
    _fadeTimer.start(); 

回答

5

另一个选择是捕获面板的屏幕截图,然后让它用渐增的alpha复合来绘制自己。

这里是一个小的演示(虽然我不知道这是真的很干净):

import java.awt.AlphaComposite; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class TestFading { 

    private static class FadingPanel extends JPanel { 
     private BufferedImage buffer; 
     private boolean isFading = false; 
     private long start; 
     private float alpha = 1.0f; 

     @Override 
     public void paint(Graphics g) { 
      if (isFading) {// During fading, we prevent child components from being painted 
       g.clearRect(0, 0, getWidth(), getHeight()); 
       ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); 
       g.drawImage(buffer, 0, 0, this);// We only draw an image of them with an alpha 
      } else { 
       super.paint(g); 
      } 
     } 

     public void fade(int time) { 
      start = System.currentTimeMillis(); 
      buffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); 
      this.print(buffer.getGraphics());// Draw the current components on the buffer 
      isFading = true; 
      final int timeInMillis = time * 1000; 
      final Timer t = new Timer(50, null); 
      t.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        long elapsed = System.currentTimeMillis() - start; 
        if (elapsed > timeInMillis) { 
         start = 0; 
         isFading = false; 
         buffer = null; 
         repaint(); 
         t.stop(); 
        } else { 
         alpha = 1.0f - (float) elapsed/timeInMillis; 
         repaint(); 
        } 
       } 
      }); 
      t.start(); 
     } 
    } 

    protected void initUI() throws MalformedURLException { 
     JFrame frame = new JFrame(TestFading.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final FadingPanel panel = new FadingPanel(); 
     JTextField textfield = new JTextField(60); 
     JLabel image = new JLabel(new ImageIcon(new URL("http://helios.gsfc.nasa.gov/image_mag_stamp.jpg"))); 
     JButton button = new JButton("Fade"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       // I use an invoke later to allow the button to release itself 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         panel.fade(5);// Fade the panel in 5s. 
        } 
       }); 
      } 
     }); 
     panel.add(textfield); 
     panel.add(image); 
     panel.add(button); 
     frame.add(panel); 
     frame.setSize(400, 300); 
     frame.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       try { 
        new TestFading().initUI(); 
       } catch (MalformedURLException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 
+0

我的JPanel不是不透明并具有青色背景色,但是当我调用'fade'时,它又变得不透明了并失去了它的背景颜色。最后,当“面部”完成时,面板会自行恢复。 –

3

未测试的伪代码。

public void fade(Container c) { 
    Component[] children = c.getComponents(); 
    for (Component component : components) { 
     // do fade thing with component 
     if (component instanceOf Container) { 
      fade((Container)component); 
     } 
    } 
} 
+0

推倒它的逻辑使用递归方法...但我有我有一个ImageIcon面板的JLabel ......我不能让他们像透明panel.setBackground(新颜色(红,绿,blue,alpha); –

+1

这是一个'10部分'的问题,我们可以通过分期获得线索吗?为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org /)。 –

+0

示例代码张贴在上面! –

3

而不是设置背景覆盖paintChildren方法。拨打super.paintChildren(),然后用半透明颜色填充组件的矩形。

+0

你可以举一个代码示例,关于如何用半透明颜色填充组件的矩形... pls :) –

0

我加了一个JLabel与图像和不透明的JPanel设置为false!

在overriden paintComponent方法中,我在super.paintComponent()调用之前设置了AlphaComposite和我的alpha。

How do I fade an image in swing?