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 JLayer
s 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.
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! –
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? = / –