2014-04-22 12 views
0

J'ai un problème en créant un rectangle transparent sur fond flou. J'essaie de faire cette tâche sur glasspane. Voici mon extrait de code.créer un rectangle transparent sur fond flou dans jframe

void createBlur() { 
    alpha = 1.0f; 
    JRootPane root = SwingUtilities.getRootPane(jf); 
    blurBuffer = GraphicsUtilities.createCompatibleImage(jf.getWidth(), jf.getHeight()); 
    Graphics2D g2d = blurBuffer.createGraphics(); 
    root.paint(g2d); 
    g2d.dispose(); 

    backBuffer = blurBuffer; 
    blurBuffer = GraphicsUtilities.createThumbnailFast(blurBuffer, jf.getWidth()/2); 
    blurBuffer = new GaussianBlurFilter(5).filter(blurBuffer, null); 
} 

où, backbuffer et blurBuffer sont des objets de BufferedImage & jf = DFrame, alpha est utilisé pour l'opacité. La méthode ci-dessus crée un effet flou très bien.

Voici le code qui crée un rectangle transparent sur panneau

protected void paintComponent(Graphics g) { 
    int x = 34; 
    int y = 34; 
    int w = getWidth() - 68; 
    int h = getHeight() - 68; 
    int arc = 30; 

    //Graphics2D g2 = currentGraphics.createGraphics(); 
    //g2.drawImage(currentGraphics, 0, 0, null); 
    Graphics2D g2 = (Graphics2D) g.create(); 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    g2.setColor(new Color(0, 0, 0, 220)); 
    g2.fillRoundRect(x, y, w, h, arc, arc); 

    g2.setStroke(new BasicStroke(1f)); 
    g2.setColor(Color.WHITE); 
    g2.drawRoundRect(x, y, w, h, arc, arc); 

    g2.dispose(); 
} 

Maintenant où je coincé est comment puis-je peins l'effet de flou et le rectangle transparent en même temps. Je n'ai pas posté le code entier ici, si quelqu'un souhaite voir le code ici le link.

Et voici une image de sortie d'échantillon souhaitée. Merci d'avance.

enter image description here

+0

Pour une meilleure aide plus tôt, un poster [MCVE] (http://stackoverflow.com/help/mcve) (minimale et complète Vérifiable Exemple). Et s'il vous plaît clarifier re la capture d'écran. Est-ce l'effet désiré ou ce que vous obtenez maintenant? Si 'maintenant', qu'est-ce qui ne va pas? –

+1

Parlez du lien vers votre lecteur de partage Google. Peu de gens le suivront, encore moins «demanderont l'accès». Au moins, les gens la courtoisie de marquer le fichier de partage comme «public» à toute personne ayant le lien. –

+0

@AndrewThompson c'est la sortie désirée et cette sortie devrait venir. Je suis capable de créer un rectangle transparent et un arrière-plan flou mais je n'ai aucune idée de comment les fusionner. Et désolé de ne pas partager le fichier comme «public» –

Répondre

2

Je suis en train de faire des têtes et des queues de votre code ...

Vous ne parvenez pas à appeler super.paintComponent ... cela pourrait vous conduire dans un même sérieux problèmes si vous n'êtes pas prudent. règle générale, simplement l'appeler;)

Soyez prudent lorsque l'état de Sa modification un contexte Graphics, par exemple ...

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

affectera tous les composants peints après celui-ci et pourrait causer quelques intéressantes ensemble problèmes graphiques que vous ne nous attendions pas ...

jf.getGlassPane().setVisible(false); 
glassPanel = new GlassPanel(); 
jf.getGlassPane().setVisible(true); 

semble inutile, en tant que composant à l'aide jf.setGlassPane(glassPanel); sera toujours le composant qui est rendu visible lorsque vous appelez jf.getGlassPane().setVisible(true);. Cela signifie également que le composant GlassPane est jamais utilisé ...

isVisible dans paintComponent Vérification est inutile, que Swing est assez intelligent pour ne pas savoir peindre des composants invisibles ...

Maintenant, après avoir dit tout cela. ..

Si vous voulez peindre sur le dessus du BlurPanel vous soit ... le contenu de la peinture après la blurBuffer est tiré, de sorte que vous dessinez ontop ou ajouter un autre composant sur le volet BlurPanel qui contient la logique de dessin vous voulez appliquer ...

Ceci est un exemple de base de ce concept. Cela ajoute un autre panneau sur la vitre qui peint le cadre personnalisé du panneau que je veux.

Cet exemple utilise un code de bibliothèque personnel et est conçu comme un exemple du concept seul, et non un exemple complètement exécutable.

BeforeAfter

import core.ui.GlowEffectFactory; 
import core.ui.GraphicsUtilities; 
import core.util.ByteFormatter; 
import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.RoundRectangle2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.text.DateFormat; 
import java.util.Date; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JRootPane; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 

public class TransparentTest { 

    public static void main(String[] args) { 
     new TransparentTest(); 
    } 

    public TransparentTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage background; 
     private BlurredGlassPane blurredGlassPane; 

     private InfoPane infoPane; 

     public TestPane() { 
      try { 
       background = ImageIO.read(new File("get your own image")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

      blurredGlassPane = new BlurredGlassPane(); 
      blurredGlassPane.setLayout(new GridBagLayout()); 
      infoPane = new InfoPane(); 
      infoPane.setFile(new File("get your own image")); 
      blurredGlassPane.add(infoPane); 

      JButton click = new JButton("Click"); 
      click.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Window win = SwingUtilities.getWindowAncestor(TestPane.this); 
        if (win instanceof JFrame) { 
         JFrame frame = (JFrame) win; 
         frame.setGlassPane(blurredGlassPane); 
         blurredGlassPane.setVisible(true); 
        } 
       } 
      }); 

      setLayout(new GridBagLayout()); 
      add(click); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return background == null ? new Dimension(200, 200) : new Dimension(background.getWidth(), background.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (background != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       int x = (getWidth() - background.getWidth())/2; 
       int y = (getHeight() - background.getHeight())/2; 
       g2d.drawImage(background, x, y, this); 
       g2d.dispose(); 
      } 
     } 
    } 

    public static class InfoPane extends JPanel { 

     protected static final int RADIUS = 20; 
     protected static final int FRAME = 4; 
     protected static final int INSET = RADIUS + FRAME; 
     protected static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(); 

     private JLabel name; 
     private JLabel path; 
     private JLabel length; 
     private JLabel lastModified; 
     private JLabel canExecute; 
     private JLabel canRead; 
     private JLabel canWrite; 
     private JLabel isDirectory; 
     private JLabel isHidden; 

     public InfoPane() { 
      setBorder(new EmptyBorder(INSET, INSET, INSET, INSET)); 
      setOpaque(false); 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.weightx = 1; 
      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      name = createLabel(Font.BOLD, 48); 
      add(name, gbc); 

      gbc.gridy++; 
      path = createLabel(); 
      add(path, gbc); 

      gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 2; 
      gbc.anchor = GridBagConstraints.WEST; 

      length = createLabel(); 
      lastModified = createLabel(); 
      add(createLabel("Size: "), gbc); 

      gbc.gridx++; 
      gbc.insets = new Insets(0, 0, 0, 10); 
      add(length, gbc); 

      gbc.insets = new Insets(0, 0, 0, 0); 
      gbc.gridx++; 
      add(createLabel("Last Modified: "), gbc); 

      gbc.gridx++; 
      add(lastModified, gbc); 
     } 

     public JLabel createLabel(String text) { 

      JLabel label = new JLabel(text); 
      label.setForeground(Color.WHITE); 
      return label; 

     } 

     public JLabel createLabel() { 

      return createLabel(""); 

     } 

     public JLabel createLabel(int style, float size) { 

      JLabel label = createLabel(); 
      label.setFont(label.getFont().deriveFont(style, size)); 
      return label; 
     } 

     public void setFile(File file) { 

      name.setText(file.getName()); 
      try { 
       path.setText(file.getParentFile().getCanonicalPath()); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
      length.setText(ByteFormatter.format(file.length())); 
      lastModified.setText(DATE_FORMAT.format(new Date(file.lastModified()))); 
      file.canExecute(); 
      file.canRead(); 
      file.canWrite(); 
      file.isDirectory(); 
      file.isHidden(); 

     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      GraphicsUtilities.applyQualityRenderingHints(g2d); 
      int width = getWidth() - 1; 
      int height = getHeight() - 1; 
      int buffer = FRAME/2; 
      RoundRectangle2D base = new RoundRectangle2D.Double(buffer, buffer, width - FRAME, height - FRAME, RADIUS, RADIUS); 
      g2d.setColor(new Color(0, 0, 0, 128)); 
      g2d.fill(base); 
      g2d.setColor(Color.WHITE); 
      g2d.setStroke(new BasicStroke(FRAME, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
      g2d.draw(base); 
      g2d.dispose(); 
     } 

    } 

    public class BlurredGlassPane extends JPanel { 

     private BufferedImage background; 

     @Override 
     public void setVisible(boolean visible) { 
      if (visible) { 
       Container parent = SwingUtilities.getAncestorOfClass(JRootPane.class, this); 
       if (parent != null) { 
        JRootPane rootPane = (JRootPane) parent; 

        BufferedImage img = new BufferedImage(rootPane.getWidth(), rootPane.getHeight(), BufferedImage.TYPE_INT_ARGB); 
        Graphics2D g2d = img.createGraphics(); 
        rootPane.printAll(g2d); 
        g2d.dispose(); 

        background = GlowEffectFactory.generateBlur(img, 40); 
       } 
      } 
      super.setVisible(visible); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(background, 0, 0, this); 
     } 

    } 

} 
+0

Merci de m'avoir donné une démo, mais je n'ai pas tellement de connaissances sur RenderingHints et beaucoup de choses dans Graphics2D parce que java docs didn ' t fournir autant d'informations sur les RenderingHints et leurs constantes. Il me faudra du temps pour comprendre votre réponse, mais peu importe ce que je comprends, dites-moi si c'est vrai ou faux? 1. créer un panneau contenant une image d'arrière-plan ou un dégradé 2. créer un effet de flou et créer simultanément le panneau de détails (rectangle transparent). 3. Dessinez le rectangle transparent sur ce panneau. 4. Enfin, tracez l'image sur la racine de la racine. –

+0

'jf.getGlassPane(). SetVisible (faux); glassPanel = new GlassPanel(); jf.getGlassPane(). SetVisible (true); 'dans ces instructions j'essayais de changer le contenu de glasspane et comme la règle des swings dit ne pas essayer de changer le contenu de tout composant visible. C'est pourquoi j'essayais de faire ces choses. –

+0

Pas vraiment. 1. Créez un panneau d'arrière-plan (image/dégradé). 2. Créez une image floue de ceci. 3. Créez un panneau capable de peindre l'image floue. 4. Ajouter quoi que ce soit au "panneau de flou". Le panneau de flou DOIT apparaître au-dessus du panneau d'arrière-plan et tout doit apparaître au-dessus ... – MadProgrammer