2015-03-19 31 views
5

Próbuję rozmycie moich JFrames. Chodzi o to, aby zamazać wszystkie komponenty/elementy sterujące w ramach JFrame za pomocą JLayer/LayerUI. Oto co zrobiłem do tej pory:Jak zrobić rozmyte JFrame/JDialog w Javie za pomocą Swing i JLayer <>?

Jest to klasa LayerUI sprawia, że ​​efekt rozmycia:

import java.awt.Component; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.awt.image.BufferedImageOp; 
import java.awt.image.ConvolveOp; 
import java.awt.image.Kernel; 
import javax.swing.JComponent; 
import javax.swing.plaf.LayerUI; 

public class BlurLayerUI extends LayerUI<Component> { 

    private BufferedImage mOffscreenImage; 
    private final BufferedImageOp mOperation; 

    public BlurLayerUI() { 
     int blurValue = 6; 
     int blurCount = blurValue*blurValue; 
     float ninth = 1.0f/blurCount; 
     float[] blurKernel = new float[blurCount]; 
     for(int i=0; i<blurCount; i++) { 
      blurKernel[i] = ninth; 
     } 
     mOperation = new ConvolveOp(new Kernel(blurValue, blurValue, blurKernel), ConvolveOp.EDGE_NO_OP, null); 
    } 

    @Override 
    public void paint (Graphics g, JComponent c) { 
     int w = c.getWidth(); 
     int h = c.getHeight(); 
     if(w == 0 || h == 0) { 
      return; 
     } 
     // only create the offscreen image if the one we have is the wrong size. 
     if(mOffscreenImage == null || mOffscreenImage.getWidth() != w || mOffscreenImage.getHeight() != h) { 
      mOffscreenImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
     } 
     Graphics2D ig2 = mOffscreenImage.createGraphics(); 
     ig2.setClip(g.getClip()); 
     super.paint(ig2, c); 
     ig2.dispose(); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.drawImage(mOffscreenImage, mOperation, 0, 0); 
    } 

} 

... i tu jest klasa test, który tworzy JFrame:

import java.awt.Component; 
import javax.swing.JLayer; 

public class BlurryTest extends javax.swing.JFrame { 

    public BlurryTest() { 
     initComponents(); 
     // what do I have to do here to blurry this JFrame ... ?? 
     JLayer<Component> blurLayer = new JLayer<>(this.getLayeredPane(), new BlurLayerUI()); 
     //this.add(blurLayer); 
     //this.setGlassPane(blurLayer); 
     //this.getGlassPane().setVisible(true); 
    } 

    private void initComponents() { 

     jButton1 = new javax.swing.JButton(); 
     jButton2 = new javax.swing.JButton(); 
     jCheckBox1 = new javax.swing.JCheckBox(); 
     jTextField1 = new javax.swing.JTextField(); 
     jTextField2 = new javax.swing.JTextField(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jButton1.setText("jButton1"); 

     jButton2.setText("jButton2"); 

     jCheckBox1.setText("jCheckBox1"); 

     jTextField1.setText("jTextField1"); 

     jTextField2.setText("jTextField2"); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
         .addComponent(jButton2) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 234, Short.MAX_VALUE) 
         .addComponent(jButton1)) 
        .addComponent(jTextField1) 
        .addComponent(jCheckBox1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
        .addComponent(jTextField2)) 
       .addContainerGap()) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jCheckBox1) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 69, Short.MAX_VALUE) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jButton1) 
        .addComponent(jButton2)) 
       .addContainerGap()) 
     ); 

     pack(); 
    }      

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new BlurryTest().setVisible(true); 
      } 
     }); 
    } 

    private javax.swing.JButton jButton1; 
    private javax.swing.JButton jButton2; 
    private javax.swing.JCheckBox jCheckBox1; 
    private javax.swing.JTextField jTextField1; 
    private javax.swing.JTextField jTextField2; 

} 

Problem leży w konstruktorze klasy. Jak mam skonstruować obiekt JLayer, który zapewnia obiektowi LayerUI rozmycie całej zawartości ramki JFrame?

Każda pomoc bardzo ceniona - dzięki!

Odpowiedz

6

składniki dodawane są bezpośrednio do ramy contentPane, spróbuj ...

JLayer<Component> blurLayer = new JLayer<>(this.getContentPane(), new BlurLayerUI()); 
setContentPane(blurLayer); 

zamiast

BluredContentPane

+0

Wielki - działa idealnie! Dziękuję bardzo! – salocinx

+0

Uratowałeś mój dzień! Dziękuję Ci ! – kylexy1357

+0

jak wyłączyć blurr i zresetować wszystkie komponenty do normalnego. –