图像与阴影和圆形边缘在javaswing

我正在尝试为这个带圆角和阴影的RoundedPane添加图像。 但我没有得到它。

我让这个小组从这个课程延伸出来

public class JPanelConFondo extends JPanel { private Image imagen; public JPanelConFondo() { } public JPanelConFondo(String nombreImagen) { if (nombreImagen != null) { imagen = new ImageIcon(getClass().getResource(nombreImagen)).getImage(); } } public JPanelConFondo(Image imagenInicial) { if (imagenInicial != null) { imagen = imagenInicial; } } public void setImagen(String nombreImagen) { if (nombreImagen != null) { imagen = new ImageIcon(getClass().getResource(nombreImagen)).getImage(); } else { imagen = null; } repaint(); } public void setImagen(Image nuevaImagen) { imagen = nuevaImagen; repaint(); } @Override public void paint(Graphics g) { if (imagen != null) { g.drawImage(imagen, 0, 0,null, this); setOpaque(false); } else { setOpaque(true); } super.paint(g); } } 

但添加图像不能留下圆角和阴影重绘。

并且还尝试将带有图像的JLabel添加到面板但未达到所需的结果。

我将不胜感激任何帮助。 谢谢

在你提供的链接中调整我的答案我能够实现这一点(借助于如何在Java +1中为作者创建圆角图像 ):

在此处输入图像描述

 import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.RenderingHints; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class ShadowTest { private JFrame frame; public ShadowTest() { initComponents(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new ShadowTest(); } }); } private void initComponents() { frame = new JFrame(); frame.setTitle("Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//app exited when frame closes frame.setResizable(false); frame.setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.HORIZONTAL; gc.insets = new Insets(10, 10, 10, 10); frame.add(new RoundedPanel(), gc); //pack frame (size components to preferred size) frame.pack(); frame.setVisible(true);//make frame visible } } class RoundedPanel extends JPanel { /** * Stroke size. it is recommended to set it to 1 for better view */ protected int strokeSize = 1; /** * Color of shadow */ protected Color shadowColor = Color.black; /** * Sets if it drops shadow */ protected boolean shady = true; /** * Sets if it has an High Quality view */ protected boolean highQuality = true; /** * Double values for Horizontal and Vertical radius of corner arcs */ //protected Dimension arcs = new Dimension(0, 0); protected Dimension arcs = new Dimension(20, 20);//creates curved borders and panel /** * Distance between shadow border and opaque panel border */ protected int shadowGap = 10; /** * The offset of shadow. */ protected int shadowOffset = 4; /** * The transparency value of shadow. ( 0 - 255) */ protected int shadowAlpha = 150; int width = 300, height = 300; BufferedImage image; BufferedImage roundedImage; public RoundedPanel() { super(); setOpaque(false); try { image = ImageIO.read(new URL("http://www.wallpaperpimper.com/wallpaper/Anime_&_Manga/Naruto/Naruto-Vs-Sasuke-1-D6UGW3NLAZ-800x600.jpg")); } catch (Exception ex) { ex.printStackTrace(); } roundedImage = makeRoundedCorner(image, 20);//make image round width = roundedImage.getWidth()+arcs.width/2;//set width and height of panel accordingly height = roundedImage.getHeight()+arcs.height/2; } public static BufferedImage makeRoundedCorner(BufferedImage image, int cornerRadius) { int w = image.getWidth(); int h = image.getHeight(); BufferedImage output = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = output.createGraphics(); // This is what we want, but it only does hard-clipping, ie aliasing // g2.setClip(new RoundRectangle2D ...) // so instead fake soft-clipping by first drawing the desired clip shape // in fully opaque white with antialiasing enabled... g2.setComposite(AlphaComposite.Src); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(Color.WHITE); g2.fill(new RoundRectangle2D.Float(0, 0, w, h, cornerRadius, cornerRadius)); // ... then compositing the image on top, // using the white shape from above as alpha source g2.setComposite(AlphaComposite.SrcAtop); g2.drawImage(image, 0, 0, null); g2.dispose(); return output; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Color shadowColorA = new Color(shadowColor.getRed(), shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha); Graphics2D graphics = (Graphics2D) g; //Sets antialiasing if HQ. if (highQuality) { graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } //Draws shadow borders if any. if (shady) { graphics.setColor(shadowColorA); graphics.fillRoundRect( shadowOffset,// X position shadowOffset,// Y position width - strokeSize - shadowOffset, // width height - strokeSize - shadowOffset, // height arcs.width, arcs.height);// arc Dimension } else { shadowGap = 1; } //Draws the rounded opaque panel with borders. graphics.setColor(getBackground()); graphics.fillRoundRect(0, 0, width - shadowGap, height - shadowGap, arcs.width, arcs.height); graphics.setColor(getForeground()); graphics.setStroke(new BasicStroke(strokeSize)); graphics.drawRoundRect(0, 0, width - shadowGap, height - shadowGap, arcs.width, arcs.height); graphics.drawImage(roundedImage, 0, 0, this);//draw the rounded image //Sets strokes to default, is better. } @Override public Dimension getPreferredSize() { return new Dimension(width, height); } } 

实际的答案将取决于你对阴影的定义是什么……

查看

  • Java:在图像上创建阴影效果
  • JPanel投影

举些例子。 他们都使用类似的掩蔽技术来生成非矩形形状的阴影,这应该有所帮助