2014-01-15 2 views
3

장식되지 않은 jFrame에 그림자를 추가하고 싶습니다. 나는 그것을 어떻게하는지에 관해 모른다. 그 누구도 알고 있니?Netbeans의 장식되지 않은 JFrame에 그림자를 추가하는 방법

+0

* "나는 장식되지 않은 jFrame에 그림자를 추가하고 싶습니다"*? 창 뒤쪽이나 창 내부에 그림자를 추가하고 싶습니까? – MadProgrammer

+0

@MadProgrammer 우리는 여기에 게시 한 이미지/스크린 샷에 그림자를 추가하는 방법을 알고 있습니다. 나는 그것이 그가 (뒤에) 의미하는 것이라고 생각한다. 다른 포럼에서 예제를 보여주는이 질문을 보았습니다. 답변을 찾지 못했습니다. 단지 질문 만 할 수 있습니다. –

+0

@MadPegrammer. 나는 창문 뒤에서 언급했다. – realProgrammer

답변

4

이것은 "속임수"입니다. 이렇게하면 창 뒤에 그림자가 생기지 않으므로 내용 뒤에 그림자가 생기게됩니다.

이 방법은 윈도우를 꾸며 줄뿐만 아니라 투명하게 만듭니다. 대체 "내용 창"은 부분적으로 채워져 그림자 효과가 뒤에 나타납니다.

import com.jhlabs.image.GaussianFilter; 
import java.awt.AlphaComposite; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsEnvironment; 
import java.awt.Image; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.awt.Transparency; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 

public class TestImageDropShadow { 

    public static void main(String[] args) { 
     new TestImageDropShadow(); 
    } 

    public TestImageDropShadow() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setUndecorated(true); 
       frame.setBackground(new Color(0, 0, 0, 0)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setContentPane(new ShadowPane()); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JLabel(new ImageIcon("/you/own/pony"))); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ShadowPane extends JPanel { 

     private BufferedImage shadow; 

     public ShadowPane() { 
      setOpaque(false); 
      setBorder(new EmptyBorder(10, 10, 10, 10)); 
     } 

     @Override 
     public void invalidate() { 
      shadow = null; 
      super.invalidate(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Insets insets = getInsets(); 
      int x = insets.left; 
      int y = insets.top; 
      int width = getWidth() - (insets.left + insets.right); 
      int height = getHeight() - (insets.top + insets.bottom); 
      if (shadow == null) { 
       // Try and "guess" the amount of shadow we can show... 
       int shadowWidth = Math.min(Math.min(insets.left, insets.top), Math.min(insets.right, insets.bottom)); 
       shadow = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
       Graphics2D g2d = shadow.createGraphics(); 
       g2d.setColor(getBackground()); 
       g2d.fillRect(0, 0, width, height); 
       g2d.dispose(); 
       shadow = generateShadow(shadow, shadowWidth, Color.BLACK, 0.5f); 
      } 
      System.out.println(insets); 
      g.drawImage(shadow, 0, 0, this); 
      g.setColor(getBackground()); 
      g.fillRect(x, y, width, height); 
     } 

    } 

    public static void applyQualityRenderingHints(Graphics2D g2d) { 
     g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
     g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
     g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 
    } 

    public static BufferedImage createCompatibleImage(int width, int height) { 
     return createCompatibleImage(width, height, Transparency.TRANSLUCENT); 
    } 

    public static BufferedImage createCompatibleImage(int width, int height, int transparency) { 
     BufferedImage image = getGraphicsConfiguration().createCompatibleImage(width, height, transparency); 
     image.coerceData(true); 
     return image; 
    } 

    public static BufferedImage createCompatibleImage(BufferedImage image) { 
     return createCompatibleImage(image, image.getWidth(), image.getHeight()); 
    } 

    public static BufferedImage createCompatibleImage(BufferedImage image, 
        int width, int height) { 
     return getGraphicsConfiguration().createCompatibleImage(width, height, image.getTransparency()); 
    } 

    public static GraphicsConfiguration getGraphicsConfiguration() { 
     return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); 
    } 

    public static BufferedImage generateBlur(BufferedImage imgSource, int size, Color color, float alpha) { 
     GaussianFilter filter = new GaussianFilter(size); 

     int imgWidth = imgSource.getWidth(); 
     int imgHeight = imgSource.getHeight(); 

     BufferedImage imgBlur = createCompatibleImage(imgWidth, imgHeight); 
     Graphics2D g2 = imgBlur.createGraphics(); 
     applyQualityRenderingHints(g2); 

     g2.drawImage(imgSource, 0, 0, null); 
     g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, alpha)); 
     g2.setColor(color); 

     g2.fillRect(0, 0, imgSource.getWidth(), imgSource.getHeight()); 
     g2.dispose(); 

     imgBlur = filter.filter(imgBlur, null); 

     return imgBlur; 
    } 

    public static BufferedImage generateShadow(BufferedImage imgSource, int size, Color color, float alpha) { 
     int imgWidth = imgSource.getWidth() + (size * 2); 
     int imgHeight = imgSource.getHeight() + (size * 2); 

     BufferedImage imgMask = createCompatibleImage(imgWidth, imgHeight); 
     Graphics2D g2 = imgMask.createGraphics(); 
     applyQualityRenderingHints(g2); 

     int x = Math.round((imgWidth - imgSource.getWidth())/2f); 
     int y = Math.round((imgHeight - imgSource.getHeight())/2f); 
     g2.drawImage(imgSource, x, y, null); 
     g2.dispose(); 

     // ---- Blur here --- 
     BufferedImage imgGlow = generateBlur(imgMask, (size * 2), color, alpha); 

     return imgGlow; 
    } 
} 

Shadowshadow

은 기본적으로 여기에 무슨 일이 우리가 처음 widnow 투명을한다. 다음으로 컨텐츠 창을 우리 자신의 특별한 ShadowPane으로 바꿉니다.

이 패널은 투명하며 EmptyBorder이 적용됩니다. 이렇게하면 추가 된 모든 것이 우리가 원하는 영역 내에 들어갈 수 있습니다.

다음으로 구성 요소의 사용 가능한 전체 공간을 나타내는 BufferedImage을 생성하지만 "가시 영역"만 채 웁니다. 우리는 이것에 그림자를 적용하고 그것을 구성 요소에 칠합니다. ,

이 예는 JHLabs

에서 GaussianFilter의 사용은 엄격하게 당신이 그것을 필요가 없습니다, 말하기하게,하지만 좀 더 복잡한 무언가의 예를 들어 좋은 "퍼지"효과

제공하지 않습니다 당신은 좀 봐 줄 수 있습니다 Java: create shadow effect on image

+0

"이 정적 메소드는 getGraphicsConfiguration() 메소드의"Component에서 인스턴스 메소드를 숨길 수 없다. "라고 알려줍니다. 모든 메서드에서 '정적'을 제거하면 실행되지만 투명한 효과는 실행되지 않습니다. – tomyforever

+0

getGraphicsConfiguration2()로 변경했지만 그림에 표시되는 테두리 투명 효과를 얻을 수 없습니다. – tomyforever

+0

해결되었지만 제 JDialog 배경색이었습니다. 나는 '새로운 Color (0,0,0,0)'이 'Color.white'와 다르다는 것을 깨닫지 못했다. – tomyforever

관련 문제