混淆JFrame打开JDialog

时间:2016-03-21 03:07:23

标签: java jframe blur

好吗? 我想知道在打开JDialog(modal = true)时如何获得,底层的JFrame(调用的)具有茫然的外观(模糊等)。另一个解决方案,也许我认为更优雅,会创建一个占据整个屏幕的JLabel,并具有透明效果。了解? 我觉得这样做很简单......但我在这里做的测试根本不起作用!如果有任何好心灵可以帮助我,我会非常高兴!

韩国社交协会!

1 个答案:

答案 0 :(得分:1)

如果您完全控制正在创建对话框的JFrame,则可以使用JLayer执行我认为您所描述的内容。来自Oracle的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);
        }
    }
}

代码有两个重要部分。首先,在创建对话框之前打开模糊,以便它获得所需的效果,然后在创建对话框后将其关闭。由于显示对话框是一种阻止操作,因此在关闭对话框之前不会关闭模糊,并且(可能)将焦点返回到JFrame

第二部分是paint的{​​{1}}方法。它有两个不同的路径,一个用于模糊,一个用于模糊。不模糊的路径只是将它传递给父类的LayerUI,它正常地绘制组件。模糊路径会将组件绘制到paint上,然后会以模糊效果绘制到屏幕上。