2012-12-03 70 views
2

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); 
    } 
} 

這將產生如下:

enter image description here

簡單的與主方法一起JPanel試圖簡單地添加th e第二個JPanelJFrame之後第一個,這隻會導致第二個面板佔用所有的空間。使用各種佈局管理器和set-Maximum/Preferred-size()方法將無濟於事。也不會使第二個面板背景變得透明。

如何添加添加JPanelJLayer上述固定尺寸,因此允許所述第一面板的部分出現(仍然模糊)?

+0

爲什麼不只是改變模糊的大小,只包含你想要的組件? –

+0

@DavidKroukamp將出現在所有其他內容上的面板包含加載圖像和其他一些元素,並且在需要時會淡入/淡出。因此,每個其他面板都將被模糊化,因此JLayer也是如此。 – Zar

+0

@Zar,常規內容是否真的需要模糊?我對於爲什麼用戶需要在加載映像後面看到一個模糊的應用程序感到困惑。 –

回答

1

通過您的評論,您想要在加載圖像時模糊數據,我會推薦一個對話框。您可以將未打開的面板放在對話框中,關閉它的框架和標題欄,並將其設置爲setUndecorated(true),並將其默認關閉行爲設置爲DO_NOTHING_ON_CLOSE,以防止用戶在加載應用程序之前關閉對話框。這將位於模糊面板的頂部,但由於它不是BlurLayerUI的一部分,所以不會模糊。

相關問題