好吗? 我想知道在打开JDialog(modal = true)时如何获得,底层的JFrame(调用的)具有茫然的外观(模糊等)。另一个解决方案,也许我认为更优雅,会创建一个占据整个屏幕的JLabel,并具有透明效果。了解? 我觉得这样做很简单......但我在这里做的测试根本不起作用!如果有任何好心灵可以帮助我,我会非常高兴!
韩国社交协会!
答案 0 :(得分:1)
如果您完全控制正在创建对话框的JFrame
,则可以使用JLayer
执行我认为您所描述的内容。来自Oracle的tutorial on JLayer
s实际上显示了一个模糊的示例,可以很容易地修改它以执行您想要的操作。这是一个工作示例,主要是被盗改编自上面链接中的示例。
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
上,然后会以模糊效果绘制到屏幕上。