2016-03-21 11 views
-3

大丈夫ですか? JDialog(modal = true)を開き、基になるJFrame(呼び出された)がぼんやりした外観(ぼかしなど)であるときにどうすればよいのでしょうか。別の解決策は、おそらくもっと優雅に考えて、画面全体を占有するJLabelを作成し、透明性の効果をもたらします。わかった? 私はそれが簡単なことだと思っていましたが、ここで行ったテストはまったく機能しません!良い魂が私を助けることができるなら、私は非常に礼儀正しいでしょう!JFrameを開く難読化JDialog

Tks!

答えて

1

ダイアログを作成しているJFrameを完全に管理している場合は、JLayerを使って説明しているようなことをすることができます。オラクルのtutorial on JLayersは実際にぼかしの例を示しています。これは、あなたが望むことを行うためにかなり簡単に変更できます。ここでは、実際にはの盗まれたの例を上のリンクの例から採用しています。

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

コードには2つの重要な部分があります。まず、ダイアログを作成する前にぼかしをオンにして、必要な効果が得られるようにしてから、ダイアログを作成した後にぼかしをオフにします。ダイアログを表示するのはブロッキング操作なので、ダイアログが閉じられてからフォーカスが(おそらく)JFrameに返されるまで、ブラーはオフになりません。

第2部分は、LayerUIpaintメソッドです。それには2つの異なるパスがあります.1つはぼかしと1つのパスです。ぼかしされていないパスは、それを親クラスのpaintに渡すだけで、コンポーネントは通常のように描画されます。ぼやけたパスは、コンポーネントをBufferedImageに塗りつぶし、ぼかし効果で画面に描画します。

+0

ねえ、ありがとう! 彼の例は私のために物事を明確にしました。 しかし私はNetbeansを使用していて、repaint()メソッドは望みの効果を持っていません。 コンポーネントを追加するためにパレットNBを使用していますが、これは問題ですか? JFrameMain JPanel1(これは男) NBがinitComponents()メソッドのパネル1を追加することを考慮して、JLayerに希望の動作をさせるにはどうすればよいですか? Tks! –

+0

男、ここではあまりうまくいかないソリューションを実装しましたが、期待される効果があります。 ユーティリティクラスでは、1つのJDialogBackgroundを作成(破棄)します。 それは、メインスレッドへの並列スレッドを実行するので、画面を開くたびにこのbackGroundDialogを呼び出します。 あまりにも悪いですか? = / –