2016-06-08 2 views
0

J'essaye de faire une sous-classe à JLabel, que j'ai appelé BlurPanel. Je veux que la classe agisse comme n'importe quel conteneur swing normal, seulement elle doit par défaut avoir un arrière-plan transparent c'est-à-dire (setOpaque (false)) et elle doit flouter l'arrière-plan du cadre parent. Jusqu'à présent, j'ai réussi à flouter BufferedImages et à les redimensionner, mais lorsque j'utilise des gestionnaires d'agencement de swing standards, j'ai du mal à recadrer l'image de la frame à la position BlurPanels. Est-ce que quelqu'un a une bonne stratégie pour le faire? Peut-être que cela peut être fait sans copier l'image sous-jacente?Création d'un JPanel floue Transperent

+2

Pas exactement ce que vous essayez de faire. Peut-être que vous pouvez utiliser la classe 'JLayer'. Consultez la section du tutoriel Swing sur [Comment décorer des composants avec la classe JLayer] (http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html). – camickr

Répondre

1

Utilisez GlassPane Luke

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.awt.event.MouseAdapter; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.Timer; 
import javax.swing.WindowConstants; 

/** 
* Glass pane used to blur the content of the window. 
* 
* @author SMedvynskyy 
*/ 
@SuppressWarnings("serial") 
public class SplashGlassPane extends JPanel implements FocusListener { 

    /** 
    * Creates new GlassPane. 
    */ 
    public SplashGlassPane() { 
     addMouseListener(new MouseAdapter() {}); 
     addMouseMotionListener(new MouseAdapter() {}); 
     addFocusListener(this); 
     setOpaque(false); 
     setFocusable(true); 
     setBackground(new Color(0, 0, 0, 190)); 
    } 

    @Override 
    public final void setVisible(boolean v) { 
     // Make sure we grab the focus so that key events don't go astray. 
     if (v) { 
      requestFocus(); 
     } 
     super.setVisible(v); 
    } 

    // Once we have focus, keep it if we're visible 
    @Override 
    public final void focusLost(FocusEvent fe) { 
     if (isVisible()) { 
      requestFocus(); 
     } 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public final void paint(Graphics g) { 
     final Color old = g.getColor(); 
     g.setColor(getBackground()); 
     g.fillRect(0, 0, getSize().width, getSize().height); 
     g.setColor(old); 
     super.paint(g); 
    } 

    @Override 
    public void focusGained(FocusEvent fe) { 
     // nothing to do 
    } 

    public static void main(String[] args) { 
     final JFrame frm = new JFrame("Test blurring"); 
     frm.add(new JTextField("It's first component"), BorderLayout.NORTH); 
     frm.add(new JTextField("It's second component"), BorderLayout.SOUTH); 
     final JButton btn = new JButton("Start blur"); 
     btn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       frm.getGlassPane().setVisible(true); 
       final Timer t = new Timer(5000, new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         frm.getGlassPane().setVisible(false); 
        } 
       }); 
       t.setRepeats(false); 
       t.start(); 
      } 
     }); 
     frm.add(btn); 
     frm.setSize(500, 400); 
     frm.setGlassPane(new SplashGlassPane()); 

     frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frm.setVisible(true); 
    } 
}