您好我正在尝试使图像透明,然后获取新图像并将其设置为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;
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));
}
}
答案 0 :(得分:1)
JPanel
能够将Image
绘制为背景
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;
}
}
利用上述小组
BufferedImage backgroundImage = ImageIO.read(...);
BackgroundPane backgroundPane = new BackgroundPane();
backgroundPane.setBackground(backgroundImage);
带有背景图片的面板,带有标签和按钮
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);
请注意,默认情况下,大多数组件都是不透明的,因此您可能需要使用setOpaque(false)
使其透明(JLabel
是例外情况之一)
在某些时候,您需要将面板添加到基于窗口的类(如JFrame
),因为这是显示它们的唯一方法