2012-12-03 2 views
2

Oracle's Myopia guide 다음에 나는 에 JLayer으로 추가 된 간단한 JPanel을 사용합니다. 충분히 간단하게, 이것은 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의 "아이들"을 흐리게 :

enter image description here

I :

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() 메소드를 사용하면 아무런 효과가 없습니다. 두 번째 패널 배경을 투명하게 만들 수도 없습니다.

어떻게 따라서 첫 번째 패널의 일부 (여전히 흐릿) 표시 할 수 있도록하는 JLayer 위의 고정 된 크기의 JPanel를 추가 추가 할 수 있습니까?

+0

왜 단지 원하는 구성 요소 만 포함하도록 흐림의 크기를 변경하지 않습니까? –

+0

@DavidKroukamp 다른 모든 내용 위에 표시 될 패널에는 로딩 이미지와 다른 요소가 포함되어 있으며 필요한 경우 페이드 인/아웃됩니다. 따라서 다른 모든 패널은이 부분의 일부로 흐려 지므로 JLayer가 흐리게 표시됩니다. – Zar

+0

@ Zar, 정규 콘텐츠를 정말 흐리게 처리해야합니까? 사용자가 로딩 이미지 뒤에 흐릿한 응용 프로그램을보아야하는 이유에 대해서는 다소 혼란 스럽습니다. –

답변

1

로딩 이미지가있는 동안 데이터를 흐리게한다는 의견에 따라 대화 상자를 권장합니다. 흐리게 처리되지 않은 패널을 대화 상자에 넣고 프레임 및 제목 표시 줄을 setUndecorated(true)으로 해제하고 기본값 닫기 동작을 DO_NOTHING_ON_CLOSE으로 설정하여 응용 프로그램이로드되기 전에 사용자가 대화 상자를 닫지 않도록 할 수 있습니다. 이렇게하면 흐린 패널 위에 놓이지 만 BlurLayerUI의 일부가 아니기 때문에 흐리게 표시되지 않습니다.