2015-03-19 11 views
5

JFrames'imi bulanıklaştırmaya çalışıyorum. Fikir, JLraer/LayerUI kullanarak bir JFrame içindeki tüm bileşenleri/denetimleri bulanıklaştırmaktır.Swing ve JLayer <> kullanarak Java'da bulanık bir JFrame/JDialog nasıl oluşturulur?

Bu bulanıklık efekti yapar LayerUI sınıftır:

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; 

} 

: Burada

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); 
    } 

} 

... ve bir JFrame yaratan bir test sınıfı var Burada şimdiye kadar yapmış ne Sorun, sınıfın yapıcısı içindedir. JFrame'in tüm içeriğini bulanıklaştırmak için LayerUI nesnesini sağlayan JLayer nesnesini nasıl oluşturmak zorundayım?

Herhangi bir yardım son derece takdir - teşekkürler! mükemmel çalışıyor -

cevap

6

Bileşenler yerine

BluredContentPane

+0

Büyük ... kullanmayı deneyin, çerçeveler contentPane doğrudan

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

eklenir! Çok teşekkür ederim! – salocinx

+0

Günümü kurtardın! teşekkür ederim ! – kylexy1357

+0

Blurr'i kapatın ve tüm bileşenleri normal olarak sıfırlayın. –

İlgili konular