2012-05-04 31 views
14

Tôi đã đặt câu hỏi về biên giới mờ JFrame (see here) và tôi nhận được câu trả lời rất hay, nhưng không may, câu trả lời chỉ hoạt động hoàn hảo trên JDK 6, chứ không phải 7. Bất kỳ ý tưởng nào làm cho nó hoạt động JDK 7?Biên giới JFrame mờ JDK 7

Trong JDK 6 nó trông như thế này:

enter image description here

Và JDK 7:

enter image description here

Và mã của tôi trông như thế này:

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

} 
} 

Cảm ơn nhiều!

+1

Bạn đã kiểm tra cơ sở dữ liệu lỗi chưa? Ảnh chụp màn hình đẹp BTW. +1 –

+0

Đã cố gắng truy cập Google về chủ đề này nhưng không thành công. –

Trả lời

3

Tôi vừa giải quyết được vấn đề của mình. Vấn đề là, JDK 7 thực hiện phương thức AWTUtilities.setWindowOpaque() từ JDK6 theo phương pháp setBackground() và tôi đã (NetBeans đã làm :-)) thiết lập nền mặc định cho JFrame ở các vị trí khác nhau, do đó thiết lập nền thành new Color(0, 0, 0, 0); làm cho JFrame trong suốt và mọi thứ đều ổn.

2

Đối với bất cứ ai tình cờ gặp chủ đề này và muốn cửa sổ trong suốt của riêng mình, tôi nghĩ ra ví dụ này. Với ít thông tin có sẵn trên web, tôi gần như đã phá vỡ một chân để tìm ra thứ gì đó chỉ hoạt động và không sử dụng tệp hình ảnh hoặc bất kỳ thứ gì. (Kết hợp từ các ví dụ khác nhau trên this trang web)

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