大丈夫ですか? JDialog(modal = true)を開き、基になるJFrame(呼び出された)がぼんやりした外観(ぼかしなど)であるときにどうすればよいのでしょうか。別の解決策は、おそらくもっと優雅に考えて、画面全体を占有するJLabelを作成し、透明性の効果をもたらします。わかった? 私はそれが簡単なことだと思っていましたが、ここで行ったテストはまったく機能しません!良い魂が私を助けることができるなら、私は非常に礼儀正しいでしょう!JFrameを開く難読化JDialog
Tks!
大丈夫ですか? JDialog(modal = true)を開き、基になるJFrame(呼び出された)がぼんやりした外観(ぼかしなど)であるときにどうすればよいのでしょうか。別の解決策は、おそらくもっと優雅に考えて、画面全体を占有するJLabelを作成し、透明性の効果をもたらします。わかった? 私はそれが簡単なことだと思っていましたが、ここで行ったテストはまったく機能しません!良い魂が私を助けることができるなら、私は非常に礼儀正しいでしょう!JFrameを開く難読化JDialog
Tks!
ダイアログを作成しているJFrame
を完全に管理している場合は、JLayer
を使って説明しているようなことをすることができます。オラクルの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);
}
}
}
コードには2つの重要な部分があります。まず、ダイアログを作成する前にぼかしをオンにして、必要な効果が得られるようにしてから、ダイアログを作成した後にぼかしをオフにします。ダイアログを表示するのはブロッキング操作なので、ダイアログが閉じられてからフォーカスが(おそらく)JFrame
に返されるまで、ブラーはオフになりません。
第2部分は、LayerUI
のpaint
メソッドです。それには2つの異なるパスがあります.1つはぼかしと1つのパスです。ぼかしされていないパスは、それを親クラスのpaint
に渡すだけで、コンポーネントは通常のように描画されます。ぼやけたパスは、コンポーネントをBufferedImage
に塗りつぶし、ぼかし効果で画面に描画します。
ねえ、ありがとう! 彼の例は私のために物事を明確にしました。 しかし私はNetbeansを使用していて、repaint()メソッドは望みの効果を持っていません。 コンポーネントを追加するためにパレットNBを使用していますが、これは問題ですか? JFrameMain JPanel1(これは男) NBがinitComponents()メソッドのパネル1を追加することを考慮して、JLayerに希望の動作をさせるにはどうすればよいですか? Tks! –
男、ここではあまりうまくいかないソリューションを実装しましたが、期待される効果があります。 ユーティリティクラスでは、1つのJDialogBackgroundを作成(破棄)します。 それは、メインスレッドへの並列スレッドを実行するので、画面を開くたびにこのbackGroundDialogを呼び出します。 あまりにも悪いですか? = / –