İletişim kutusunu oluşturan JFrame
üzerinde tam denetime sahipseniz, JLayer
kullanarak anlattığınızı düşündüğüm gibi bir şey yapabilirsiniz. Oracle'dan gelen tutorial on JLayer
s aslında, istediğinizi yapmak için kolayca değiştirilebilen bulanık bir örnek gösteriyor. İşte, yukarıdaki bağlantıdan örnekte uyarlanmış çoğunlukla çalıntı olan çalışan bir örnek.
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);
}
}
}
Kodun iki önemli kısmı var. İlk olarak, diyaloğu oluşturmadan önce bulanıklığı açarak, ihtiyacınız olan efekti elde edersiniz ve diyaloğu oluşturduktan sonra kapatırız. Bir iletişim kutusunun gösterilmesi bir engelleme işlemi olduğundan, iletişim kutusu kapatılıncaya kadar bulanıklık kapanmaz ve odaklanma (muhtemelen) JFrame
'a döndürülür.
İkinci bölüm, LayerUI
'un paint
yöntemidir. Biri bulanıklaşmak için iki farklı yola sahiptir. Renksiz yol, onu, normal olarak bileşeni çeken ebeveyn sınıfının paint
numarasına aktarır. Bunun yerine, bulanık yol, bileşeni BufferedImage
üzerine boyayarak, daha sonra bulanıklaştırma efekti ile ekrana çizilir.
Hey adamım, teşekkürler! Onun örneği benim için bazı şeyleri netleştirdi ve bunun uygulanması basit olduğunu görüyorum. Ancak Netbeans kullanıyorum ve repaint() yöntemi istenen etkiyi almadı. Bileşen eklemek için palet NB kullanıyorum ve belki bu bir problem mi? JFrameMain JPanel1 (bu adam) JLayer, initComponents() yöntemindeki NB ek panel1'i dikkate alarak istenen davranışı nasıl alabilirim? Tks! –
İnsan, burada iyi olmayan bir çözüm uyguladım, ancak beklenen etkiyi yarattı. Bir yardımcı program sınıfında bir JDialogBackground yaratıyorum (ve yok et). Ana iş parçacığına paralel bir iş parçacığı üzerinden çalışır, bu yüzden bir ekran açtığımda her zaman bu backGroundDialog olarak adlandırılır .. Çok kötü? = / –