2016-03-21 24 views
-3

tamam mı? Bir JDialog açarken (modal = true), altta yatan JFrame (çağrılan) sersemlemiş bir görünümle (bulanık, vb.) Ne zaman alırım? Başka bir çözüm, belki daha da zarif düşünürüm, tüm ekranı işgal etmek için bir JLabel yaratacak ve şeffaflık etkisi yaşayacaktı. Anladım? Yapılması kolay bir şey olacağını düşündüm .. ama burada yaptığım testler hiç çalışmıyor! Eğer iyi bir ruh bana yardım ederse, ÇOK YARARLI olurdum!Obfuscate JFrame açılış JDialog

Tks!

cevap

1

İletişim kutusunu oluşturan JFrame üzerinde tam denetime sahipseniz, JLayer kullanarak anlattığınızı düşündüğüm gibi bir şey yapabilirsiniz. Oracle'dan gelen tutorial on JLayers aslında, istediğinizi yapmak için kolayca değiştirilebilen bulanık bir örnek gösteriyor. İşte, yukarıdaki bağlantıdan örnekte uyarlanmış çoğunlukla çalıntı olan çalışan bir örnek.

public class Example { 
    public static void main(String[] args){ 
     final JFrame f = new JFrame("Wallpaper"); 

     JPanel panel = new JPanel(); 
     final BlurLayer layerUI = new BlurLayer(); 
     JLayer<JComponent> jlayer = new JLayer<JComponent>(panel, layerUI); 
     JButton button = new JButton("Click Me"); 
     panel.add(button); 
     button.addActionListener(new ActionListener(){ 
       @Override 
       public void actionPerformed(ActionEvent e){ 
        layerUI.blurred = true; 
        f.repaint(); 
        JOptionPane.showMessageDialog(f, "Message"); 
        layerUI.blurred = false; 
        f.repaint(); 
       } 
      }); 

     f.add (jlayer); 

     f.setSize(300, 200); 
     f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     f.setVisible (true); 
    } 
} 

class BlurLayer extends LayerUI<JComponent>{ 
    private BufferedImage mOffscreenImage; 
    private BufferedImageOp mOperation; 
    public boolean blurred; 

    public BlurLayer() { 
     float ninth = 1.0f/9.0f; 
     float[] blurKernel = { 
      ninth, ninth, ninth, 
      ninth, ninth, ninth, 
      ninth, ninth, ninth 
     }; 
     mOperation = new ConvolveOp(new Kernel(3, 3, 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; 
     } 

     if(blurred){ 
      // 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); 
     }else{ 
      super.paint(g, c); 
     } 
    } 
} 

Kodun iki önemli kısmı var. İlk olarak, diyaloğu oluşturmadan önce bulanıklığı açarak, ihtiyacınız olan efekti elde edersiniz ve diyaloğu oluşturduktan sonra kapatırız. Bir iletişim kutusunun gösterilmesi bir engelleme işlemi olduğundan, iletişim kutusu kapatılıncaya kadar bulanıklık kapanmaz ve odaklanma (muhtemelen) JFrame'a döndürülür.

İkinci bölüm, LayerUI'un paint yöntemidir. Biri bulanıklaşmak için iki farklı yola sahiptir. Renksiz yol, onu, normal olarak bileşeni çeken ebeveyn sınıfının paint numarasına aktarır. Bunun yerine, bulanık yol, bileşeni BufferedImage üzerine boyayarak, daha sonra bulanıklaştırma efekti ile ekrana çizilir.

+0

Hey adamım, teşekkürler! Onun örneği benim için bazı şeyleri netleştirdi ve bunun uygulanması basit olduğunu görüyorum. Ancak Netbeans kullanıyorum ve repaint() yöntemi istenen etkiyi almadı. Bileşen eklemek için palet NB kullanıyorum ve belki bu bir problem mi? JFrameMain JPanel1 (bu adam) JLayer, initComponents() yöntemindeki NB ek panel1'i dikkate alarak istenen davranışı nasıl alabilirim? Tks! –

+0

İnsan, burada iyi olmayan bir çözüm uyguladım, ancak beklenen etkiyi yarattı. Bir yardımcı program sınıfında bir JDialogBackground yaratıyorum (ve yok et). Ana iş parçacığına paralel bir iş parçacığı üzerinden çalışır, bu yüzden bir ekran açtığımda her zaman bu backGroundDialog olarak adlandırılır .. Çok kötü? = / –