Java 图像透明度和JPanel图像背景
您好,我正在尝试使图像透明,然后获得一个新图像并将其设置为jpanel背景。我知道,我知道你可能会说已经有了答案,但是没有,什么都不起作用,我不知道为什么,我真的很感谢你的帮助 代码如下:Java 图像透明度和JPanel图像背景,java,swing,background,imageicon,Java,Swing,Background,Imageicon,您好,我正在尝试使图像透明,然后获得一个新图像并将其设置为jpanel背景。我知道,我知道你可能会说已经有了答案,但是没有,什么都不起作用,我不知道为什么,我真的很感谢你的帮助 代码如下: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; i
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Time;
import javax.swing.Timer;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class DvdInterface extends JPanel {
private String cathegory;
private JPanel hiddenPnl = new JPanel();
private JPanel imagePnl;
private ImageIcon imageLoading;
private TextAnimation textMoving = new TextAnimation();
private ImageIcon bgImg;
private Timer tm;
private int x = 0;
private int y = 240;
private DvdInterface dvd;
public DvdInterface(){
components();
setVisible(true);
}
private void components(){
this.setLayout(null);
JLabel text = new JLabel("Movie selector");
JLabel select = new JLabel("Please select a movie");
JLabel empty2 = new JLabel("");
JLabel empty3 = new JLabel("");
JLabel empty4 = new JLabel("");
imageLoading = new ImageIcon("D:/Java Eclipe Workspace/Dvd sorter/Loading.jpg");
Image img = imageLoading.getImage();
Image tempImg = img.getScaledInstance(200, 250, Image.SCALE_SMOOTH);
imageLoading = new ImageIcon(tempImg);
JLabel labelImg = new JLabel(imageLoading, JLabel.CENTER);
labelImg.setBounds(198, 202, 200, 250);
text.setBounds(235, 150, 183, 57);
paintSelect(select);
paintSelect(text);
add(select);
add(labelImg);
add(text);
tm = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
select.setBounds(205, 200, 250, 270);
if(x >= 0){
x = x + 10;
}
if(x == 250){
x = x - 150;
}
select.setForeground(new Color(0, 255, 100, x));
}
});
tm.start();
}
public void setCathegory(String cathegory) {
this.cathegory = cathegory;
}
public void paintSelect(JLabel select){
select.setFont(new Font("Engravers MT", Font.BOLD, 10));
}
}
一种能够把图像作为背景画的喷气式飞机
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class BackgroundPane extends JPanel {
private BufferedImage img;
private BufferedImage scaled;
public BackgroundPane() {
}
@Override
public Dimension getPreferredSize() {
return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight());
}
public void setBackground(BufferedImage value) {
if (value != img) {
this.img = value;
repaint();
}
}
@Override
public void invalidate() {
super.invalidate();
if (getWidth() > img.getWidth() || getHeight() > img.getHeight()) {
scaled = getScaledInstanceToFill(img, getSize());
} else {
scaled = img;
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (scaled != null) {
int x = (getWidth() - scaled.getWidth()) / 2;
int y = (getHeight() - scaled.getHeight()) / 2;
g.drawImage(scaled, x, y, this);
}
}
public static BufferedImage getScaledInstanceToFill(BufferedImage img, Dimension size) {
double scaleFactor = getScaleFactorToFill(img, size);
return getScaledInstance(img, scaleFactor);
}
public static double getScaleFactorToFill(BufferedImage img, Dimension size) {
double dScale = 1;
if (img != null) {
int imageWidth = img.getWidth();
int imageHeight = img.getHeight();
double dScaleWidth = getScaleFactor(imageWidth, size.width);
double dScaleHeight = getScaleFactor(imageHeight, size.height);
dScale = Math.max(dScaleHeight, dScaleWidth);
}
return dScale;
}
public static double getScaleFactor(int iMasterSize, int iTargetSize) {
double dScale = (double) iTargetSize / (double) iMasterSize;
return dScale;
}
public static BufferedImage getScaledInstance(BufferedImage img, double dScaleFactor) {
return getScaledInstance(img, dScaleFactor, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);
}
protected static BufferedImage getScaledInstance(BufferedImage img, double dScaleFactor, Object hint, boolean bHighQuality) {
BufferedImage imgScale = img;
int iImageWidth = (int) Math.round(img.getWidth() * dScaleFactor);
int iImageHeight = (int) Math.round(img.getHeight() * dScaleFactor);
if (dScaleFactor <= 1.0d) {
imgScale = getScaledDownInstance(img, iImageWidth, iImageHeight, hint, bHighQuality);
} else {
imgScale = getScaledUpInstance(img, iImageWidth, iImageHeight, hint, bHighQuality);
}
return imgScale;
}
protected static BufferedImage getScaledDownInstance(BufferedImage img,
int targetWidth,
int targetHeight,
Object hint,
boolean higherQuality) {
int type = (img.getTransparency() == Transparency.OPAQUE)
? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage ret = (BufferedImage) img;
if (targetHeight > 0 || targetWidth > 0) {
int w, h;
if (higherQuality) {
// Use multi-step technique: start with original size, then
// scale down in multiple passes with drawImage()
// until the target size is reached
w = img.getWidth();
h = img.getHeight();
} else {
// Use one-step technique: scale directly from original
// size to target size with a single drawImage() call
w = targetWidth;
h = targetHeight;
}
do {
if (higherQuality && w > targetWidth) {
w /= 2;
if (w < targetWidth) {
w = targetWidth;
}
}
if (higherQuality && h > targetHeight) {
h /= 2;
if (h < targetHeight) {
h = targetHeight;
}
}
BufferedImage tmp = new BufferedImage(Math.max(w, 1), Math.max(h, 1), type);
Graphics2D g2 = tmp.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
g2.drawImage(ret, 0, 0, w, h, null);
g2.dispose();
ret = tmp;
} while (w != targetWidth || h != targetHeight);
} else {
ret = new BufferedImage(1, 1, type);
}
return ret;
}
protected static BufferedImage getScaledUpInstance(BufferedImage img,
int targetWidth,
int targetHeight,
Object hint,
boolean higherQuality) {
int type = BufferedImage.TYPE_INT_ARGB;
BufferedImage ret = (BufferedImage) img;
int w, h;
if (higherQuality) {
// Use multi-step technique: start with original size, then
// scale down in multiple passes with drawImage()
// until the target size is reached
w = img.getWidth();
h = img.getHeight();
} else {
// Use one-step technique: scale directly from original
// size to target size with a single drawImage() call
w = targetWidth;
h = targetHeight;
}
do {
if (higherQuality && w < targetWidth) {
w *= 2;
if (w > targetWidth) {
w = targetWidth;
}
}
if (higherQuality && h < targetHeight) {
h *= 2;
if (h > targetHeight) {
h = targetHeight;
}
}
BufferedImage tmp = new BufferedImage(w, h, type);
Graphics2D g2 = tmp.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
g2.drawImage(ret, 0, 0, w, h, null);
g2.dispose();
ret = tmp;
tmp = null;
} while (w != targetWidth || h != targetHeight);
return ret;
}
}
带有背景图像、标签和按钮的面板
backgroundPane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
backgroundPane.add(new JLabel("This is a label"), gbc);
backgroundPane.add(new JButton("This is a button"), gbc);
请记住,大多数组件在默认情况下是不透明的,因此您可能需要使用setOpaquefalse使其透明。JLabel是例外之一
在某些情况下,您需要将面板添加到基于窗口的类(如JFrame)中,因为这是显示面板的唯一方法——然后您只需将您想要显示的其他内容添加到这些容器中即可。我会对空布局保持警惕请仔细阅读答案,背景图像的基本功能封装在JLabel或JPanel中-然后它们会显示在JFrame中-因为没有一个UI就无法显示UI-这是不可能的。但是,你可以创建一个,它可以让你做一些事情,比如他没有把图像放在JPanel上,他使用的是JFrame,我需要它作为JPanel的背景。而且他的方式也不起作用,如果我用那个图像设置我的框架,所有的东西都会被推到那个图像下面!公共类BackgroundPane扩展JPanel{不是JFrame-您的基本问题是对容器层次结构如何工作的误解。使用BackgroundPane并向其添加组件-问题已解决
backgroundPane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
backgroundPane.add(new JLabel("This is a label"), gbc);
backgroundPane.add(new JButton("This is a button"), gbc);