繼Oracle's Myopia guide,我有一個簡單JPanel
被添加到一個JFrame
作爲JLayer
。很簡單,這會模糊JPanel
的組件。但是,我試圖在JPanel
之上添加第二個JPanel
(這意味着它不會變得模糊)。添加具有固定大小一個JPanel上方的JLayer
public class ContentPanel extends JPanel {
public ContentPanel() {
setLayout(new BorderLayout());
add(new JLabel("Hello world, this is blurry!"), BorderLayout.NORTH);
add(new JLabel("Hello world, this is blurry!"), BorderLayout.CENTER);
add(new JButton("Blurry button"), BorderLayout.SOUTH);
}
public static void main(String[] args) {
JFrame f = new JFrame("Foo");
f.setSize(300, 200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
LayerUI<JComponent> layerUI = new BlurLayerUI();
JPanel panel = new ContentPanel();
JLayer<JComponent> jlayer = new JLayer<JComponent>(panel, layerUI);
f.add(jlayer);
f.setVisible(true);
}
}
BlurLayerUI
這模糊了它的 「孩子」:
class BlurLayerUI extends LayerUI<JComponent> {
private BufferedImage mOffscreenImage;
private BufferedImageOp mOperation;
public BlurLayerUI() {
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;
}
// 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);
}
}
這將產生如下:
我
簡單的與主方法一起JPanel
試圖簡單地添加th e第二個JPanel
到JFrame
之後第一個,這隻會導致第二個面板佔用所有的空間。使用各種佈局管理器和set-Maximum/Preferred-size()
方法將無濟於事。也不會使第二個面板背景變得透明。
如何添加添加JPanel
與JLayer
上述固定尺寸,因此允許所述第一面板的部分出現(仍然模糊)?
爲什麼不只是改變模糊的大小,只包含你想要的組件? –
@DavidKroukamp將出現在所有其他內容上的面板包含加載圖像和其他一些元素,並且在需要時會淡入/淡出。因此,每個其他面板都將被模糊化,因此JLayer也是如此。 – Zar
@Zar,常規內容是否真的需要模糊?我對於爲什麼用戶需要在加載映像後面看到一個模糊的應用程序感到困惑。 –