Je voudrais faire un flou sur l'arrière-plan du JFrame qui est transparent pour montrer ce qui se passe en dessous, mais je n'ai aucune idée de la façon dont je peux flouter l'arrière-plan et éviter le scintillement. Ce que je veux obtenir, c'est un arrière-plan transparent qui soit légèrement flou, mais qui montre toujours la "vue en direct" de la fenêtre située en dessous, et non pas une image statique floue qui ne change pas. Gardez à l'esprit que la fenêtre peut prendre la taille du plein écran.
J'espère l'avoir décrit correctement, car je suis encore un débutant en Java Graphics.
Le cadre transparent en code :
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class BlurredBackgroundWindow {
public static void main(String[] args) {
new BlurredBackgroundWindow().drawGUI();
}
public void drawGUI() {
myJFrame frm = new myJFrame();
frm.setTitle("BlurredBackgroundWindow");
frm.setSize(480, 360);
frm.setUndecorated(true);
frm.setBackground(new Color(0,0,0,1));
frm.setLocationRelativeTo(null);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
class myJFrame extends JFrame {
public void paint(Graphics g) {
super.paint(g);
// Doing the rest of painting here
}
}
}
Note - Le cadre est complètement transparent et pour voir un certain effet, changez la couleur à eg.
frm.setBackground(new Color(0,100,0,100));
Merci pour toute aide
EDIT 1 : Voici l'effet en action AVEC le scintillement que je veux éviter, mais je ne sais pas vraiment comment... Celui-ci ne fonctionne que pour une fenêtre en plein écran.
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
public class BlurredBackgroundWindow {
public static int FPS = 2;
private BufferedImage temp = null;
private BufferedImage out = null;
private BufferedImage image = null;
myJFrame frm = new myJFrame();
public static void main(String[] args) {
new BlurredBackgroundWindow().drawGUI();
}
public void drawGUI() {
frm.setTitle("BlurredBackgroundWindow");
frm.setExtendedState(JFrame.MAXIMIZED_BOTH);
frm.setUndecorated(true);
frm.setBackground(new Color(0,0,0,1));
frm.setLocationRelativeTo(null);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
Timer bcg = new Timer();
bcg.schedule(new TimerTask() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screenRectangle = new Rectangle(screenSize);
Robot robot;
public void run() {
System.out.println("Repaint");
frm.repaint();
try {
robot = new Robot();
image = robot.createScreenCapture(screenRectangle);
} catch (AWTException e) {}
frm.repaint();
// Save the blurred image for debugging
/*try {
ImageIO.write(image, "png", new File("C:\\test.png"));
} catch (IOException e) {
e.printStackTrace();
}*/
}
}, 0, (int) (1000f/FPS));
}
class myJFrame extends JFrame {
public void paint(Graphics g) {
super.paint(g);
if(image != null) {
float[] matrix = {
0.111f, 0.111f, 0.111f,
0.111f, 0.111f, 0.111f,
0.111f, 0.111f, 0.111f,
};
BufferedImageOp op = new ConvolveOp( new Kernel(3, 3, matrix) );
temp = op.filter(image, out);
out = temp;
g.drawImage(out,0,0,null);
temp=null;out=null;image=null;
}
}
}
}