2012-05-04 3 views
14

반투명 JFrame 테두리 (see here)에 대한 질문이 있는데 아주 좋은 답변이 있지만 유감스럽게도 주어진 답변은 JDK 6에서만 완벽하게 작동하지만 7이 아니라면 완벽하게 작동합니다. JDK 7?반투명 JFrame 테두리 JDK 7

import java.awt.*; 
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.border.AbstractBorder; 


public class ShadowBorder extends AbstractBorder { 

private static final int RADIUS = 30; 
private static BufferedImage shadowTop; 
private static BufferedImage shadowRight; 
private static BufferedImage shadowBottom; 
private static BufferedImage shadowLeft; 
private static BufferedImage shadowTopLeft; 
private static BufferedImage shadowTopRight; 
private static BufferedImage shadowBottomLeft; 
private static BufferedImage shadowBottomRight; 
private static boolean shadowsLoaded = false; 

public ShadowBorder() { 
    if (!shadowsLoaded) { 
     try { 
      shadowTop = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-top.png")); 
      shadowRight = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-right.png")); 
      shadowBottom = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-bottom.png")); 
      shadowLeft = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-left.png")); 

      shadowTopLeft = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-top-left.png")); 
      shadowTopRight = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-top-right.png")); 
      shadowBottomLeft = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-bottom-left.png")); 
      shadowBottomRight = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-bottom-right.png")); 

      shadowsLoaded = true; 
     } catch (IOException ex) { 
      Logger.getLogger(ShadowBorder.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

@Override 
public boolean isBorderOpaque() { 
    return false; 
} 

@Override 
public Insets getBorderInsets(Component c) { 
    return new Insets(RADIUS, RADIUS, RADIUS, RADIUS); 
} 

@Override 
public Insets getBorderInsets(Component c, Insets insets) { 
    insets.top = RADIUS; 
    insets.left = RADIUS; 
    insets.bottom = RADIUS; 
    insets.right = RADIUS; 

    return insets; 
} 

@Override 
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
    Graphics2D g2d = (Graphics2D) g.create(); 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_ATOP, 1f)); 

    int recWidth = width - (2 * RADIUS); 
    int recHeight = height - (2 * RADIUS); 
    int recX = width - RADIUS; 
    int recY = height - RADIUS; 

    //edges 
    g2d.drawImage(shadowTop.getScaledInstance(recWidth, RADIUS, Image.SCALE_REPLICATE), RADIUS, 0, null); 
    g2d.drawImage(shadowRight.getScaledInstance(RADIUS, recHeight, Image.SCALE_REPLICATE), recX, RADIUS, null); 
    g2d.drawImage(shadowBottom.getScaledInstance(recWidth, RADIUS, Image.SCALE_REPLICATE), RADIUS, recY, null); 
    g2d.drawImage(shadowLeft.getScaledInstance(RADIUS, recHeight, Image.SCALE_REPLICATE), 0, RADIUS, null); 

    //corners 
    g2d.drawImage(shadowTopLeft, 0, 0, null); 
    g2d.drawImage(shadowTopRight, recX, 0, null); 
    g2d.drawImage(shadowBottomLeft, 0, recY, null); 
    g2d.drawImage(shadowBottomRight, recX, recY, null); 

} 
} 

감사를 :

는 JDK 6에서 그것은 다음과 같습니다

enter image description here

그리고 JDK 7 :

enter image description here

그리고 내 코드는 다음과 같습니다 제비!

+1

버그 데이터베이스를 확인 했습니까? 좋은 스크린 샷 BTW. +1 –

+0

Google에이 항목에 대해 시도했지만 성공하지는 못했습니다. –

답변

3

방금 ​​문제를 해결했습니다. 문제는 JDK 7이 setBackground() 메서드에서 JDK6의 AWTUtilities.setWindowOpaque() 메서드를 구현하고 (NetBeans가 :-)) 다른 장소에있는 JFrame의 기본 배경을 설정했기 때문에 배경을 new Color(0, 0, 0, 0);으로 설정하면 JFrame이 투명 해지고 모두 잘되어 간다는 것입니다.

2

이 스레드를 우연히 발견하고 자신의 투명한 창을 원하는 사람은 누구나이 예제를 고안했습니다. 웹상에서 정보가 거의없는 상태에서 다리를 부러 뜨려 뭔가 효과가 있다고 생각하고 이미지 파일이나 다른 것을 사용하지 않았습니다. (this 사이트의 다른 예제와 결합)

public class GradientTranslucentWindowDemo 
{ 
    public static void main(String[] args) 
    { 
     // Create the GUI on the event-dispatching thread 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       final JFrame f = new JFrame("Per-pixel translucent window"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       f.setUndecorated(true); 
       f.setBackground(new Color(0, 0, 0, 0)); 

       final BufferedImage backrgoundImage = makeBackrgoundImage(400, 400); 

       JPanel panel = new JPanel() 
       { 
        @Override 
        public void paintComponent(Graphics g) 
        { 
         super.paintComponent(g); 
         if (g instanceof Graphics2D) 
         { 

          g.drawImage(backrgoundImage, 0, 0, null); 
         } 
        } 
       }; 
       panel.setOpaque(false); 
       f.setContentPane(panel); 

       f.setLayout(new GridBagLayout()); // Centers the button 
       f.add(new JButton(new AbstractAction("Close") 
       { 
        @Override 
        public void actionPerformed(ActionEvent e) 
        { 
         f.dispose(); 
        } 
       })); 

       f.setBounds(100, 100, 400, 400); 
       f.setVisible(true); 
      } 
     }); 
    } 

    static BufferedImage makeBackrgoundImage(int w, int h) 
    { 
     BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 

     // Draw something transparent 
     Graphics2D g = img.createGraphics(); 
     g.setPaint(new RadialGradientPaint(new Point2D.Float(w/2, h/2), (w + h)/4, new float[]{0, 1}, new Color[]{Color.RED, new Color(1f, 0, 0, 0)})); 
     g.fillRect(0, 0, w, h); 
     g.setPaint(Color.RED); 
     g.drawRect(0, 0, w - 1, h - 1); 
     g.dispose(); 

     return img; 
    } 
} 
관련 문제