2016-03-21 7 views
-3

okay? Ich frage mich, wie bekomme ich beim Öffnen eines JDialog (modal = true), der zugrunde liegende JFrame (die aufgerufen) ist mit einem benommenen Aussehen (verschwommen, etc). Eine andere Lösung, vielleicht noch eleganter, würde ein JLabel erstellen, das den gesamten Bildschirm einnimmt und einen Transparenzeffekt hat. Verstanden? Ich dachte, es wäre etwas Einfaches ... aber die Tests, die ich hier gemacht habe, funktionieren überhaupt nicht! Wenn irgendeine gute Seele mir helfen kann, wäre ich sehr dankbar!Obfuscate JFrame Eröffnung JDialog

Tks!

Antwort

1

Wenn Sie die volle Kontrolle über die JFrame haben, die den Dialog erstellt, können Sie etwas tun, was ich denke, Sie beschreiben mit einer JLayer. Die tutorial on JLayers von Oracle zeigt tatsächlich ein unscharfes Beispiel, das ziemlich leicht modifiziert werden kann, um zu tun, was Sie wollen. Hier ist ein funktionierendes Beispiel, das meistens gestohlen ist, das vom Beispiel auf dem Link oben angepasst wurde.

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

Es gibt zwei wichtige Teile des Codes. Schalten Sie zunächst die Unschärfe ein, bevor Sie das Dialogfeld erstellen, damit es den gewünschten Effekt erhält, und schalten Sie es nach dem Erstellen des Dialogfelds aus. Da das Anzeigen eines Dialogfelds ein Blockiervorgang ist, wird die Unschärfe erst nach dem Schließen des Dialogfelds deaktiviert, und der Fokus wird (vermutlich) auf JFrame zurückgesetzt. Der zweite Teil ist die paint Methode der LayerUI. Es hat zwei verschiedene Pfade, einen für Unschärfe und einen nicht. Der unverwischte Pfad leitet ihn einfach an die paint der übergeordneten Klasse weiter, die die Komponente wie üblich zeichnet. Der verschwommene Pfad malt stattdessen die Komponente auf eine BufferedImage, die dann mit einem Unschärfeeffekt auf den Bildschirm gezogen wird.

+0

Hey Mann, danke! Sein Beispiel hat Dinge für mich geklärt, und ich sehe, dass das einfach zu implementieren ist. Aber ich benutze Netbeans und repaint() Methode hatte nicht den gewünschten Effekt. Ich benutze die Palette NB, um Komponenten hinzuzufügen und vielleicht ist dies ein Problem? JFrameMain jPanel1 (dies ist der Typ) Wie erhalte ich JLayer das gewünschte Verhalten der NB fügt panel1 in initComponents() Methode unter Berücksichtigung haben? Tks! –

+0

Mann, ich habe eine Lösung hier nicht so gut umgesetzt, aber es hat die erwartete Wirkung. In einer Dienstprogrammklasse erstelle ich (und zerstöre) ein JDialogBackground. Es läuft durch einen parallelen Thread zum Haupt-Thread, so dass jedes Mal, wenn ich einen Bildschirm öffne, auch diesen backGroundDialog aufrufen. Schade? = / –

Verwandte Themen