gpt4 book ai didi

java - java swing中带有阴影和圆角边缘的图像

转载 作者:行者123 更新时间:2023-12-02 07:04:08 24 4
gpt4 key购买 nike

我正在尝试将图像添加到 this 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 添加到面板中,但没有达到预期的效果。

如果有任何帮助,我将不胜感激。谢谢

最佳答案

调整my answer在您提供的链接中,我能够做到这一点(在 How to make a rounded corner image in Java +1 的帮助下给作者):

enter image description here

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, i.e. 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 - java swing中带有阴影和圆角边缘的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com