Java 将图像设置为JPanel背景的最简单方法
我如何将背景图像添加到我的JPanel中而不创建新的类或方法,而只是将其与JPanel的其余属性一起插入 我试图使用图像设置JPanel的背景,但是,我发现的每个示例似乎都建议使用自己的类扩展面板 我一直在寻找一种方法来简单地添加图像,而不创建一个全新的类,并且在同一个方法中(试图保持事情的组织性和简单性) 下面是设置我的JPanel的方法示例:Java 将图像设置为JPanel背景的最简单方法,java,image,swing,background,jpanel,Java,Image,Swing,Background,Jpanel,我如何将背景图像添加到我的JPanel中而不创建新的类或方法,而只是将其与JPanel的其余属性一起插入 我试图使用图像设置JPanel的背景,但是,我发现的每个示例似乎都建议使用自己的类扩展面板 我一直在寻找一种方法来简单地添加图像,而不创建一个全新的类,并且在同一个方法中(试图保持事情的组织性和简单性) 下面是设置我的JPanel的方法示例: public static JPanel drawGamePanel(){ //Create game panel and attribute
public static JPanel drawGamePanel(){
//Create game panel and attributes
JPanel gamePanel = new JPanel();
Image background = Toolkit.getDefaultToolkit().createImage("Background.png");
gamePanel.drawImage(background, 0, 0, null);
//Set Return
return gamePanel;
}
据我所知,可以这样做的方法是重写要求继承
JPanel的paintComponent
方法
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // paint the background image and scale it to fill the entire space
g.drawImage(/*....*/);
}
另一种方法(有点复杂)是创建第二个自定义JPanel
并将其作为主应用程序的背景
图像面板
public class ImagePanel extends JPanel
{
private static final long serialVersionUID = 1L;
private Image image = null;
private int iWidth2;
private int iHeight2;
public ImagePanel(Image image)
{
this.image = image;
this.iWidth2 = image.getWidth(this)/2;
this.iHeight2 = image.getHeight(this)/2;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (image != null)
{
int x = this.getParent().getWidth()/2 - iWidth2;
int y = this.getParent().getHeight()/2 - iHeight2;
g.drawImage(image,x,y,this);
}
}
}
public class EmptyPanel extends JPanel{
private static final long serialVersionUID = 1L;
public EmptyPanel() {
super();
init();
}
@Override
public boolean isOptimizedDrawingEnabled() {
return false;
}
public void init(){
LayoutManager overlay = new OverlayLayout(this);
this.setLayout(overlay);
ImagePanel iPanel = new ImagePanel(new IconToImage(IconFactory.BG_CENTER).getImage());
iPanel.setLayout(new BorderLayout());
this.add(iPanel);
iPanel.setOpaque(false);
}
}
清空面板
public class ImagePanel extends JPanel
{
private static final long serialVersionUID = 1L;
private Image image = null;
private int iWidth2;
private int iHeight2;
public ImagePanel(Image image)
{
this.image = image;
this.iWidth2 = image.getWidth(this)/2;
this.iHeight2 = image.getHeight(this)/2;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (image != null)
{
int x = this.getParent().getWidth()/2 - iWidth2;
int y = this.getParent().getHeight()/2 - iHeight2;
g.drawImage(image,x,y,this);
}
}
}
public class EmptyPanel extends JPanel{
private static final long serialVersionUID = 1L;
public EmptyPanel() {
super();
init();
}
@Override
public boolean isOptimizedDrawingEnabled() {
return false;
}
public void init(){
LayoutManager overlay = new OverlayLayout(this);
this.setLayout(overlay);
ImagePanel iPanel = new ImagePanel(new IconToImage(IconFactory.BG_CENTER).getImage());
iPanel.setLayout(new BorderLayout());
this.add(iPanel);
iPanel.setOpaque(false);
}
}
IconToImage
public class IconToImage {
Icon icon;
Image image;
public IconToImage(Icon icon) {
this.icon = icon;
image = iconToImage();
}
public Image iconToImage() {
if (icon instanceof ImageIcon) {
return ((ImageIcon)icon).getImage();
} else {
int w = icon.getIconWidth();
int h = icon.getIconHeight();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(w, h);
Graphics2D g = image.createGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
return image;
}
}
/**
* @return the image
*/
public Image getImage() {
return image;
}
}
我试图使用图像设置JPanel的背景,但是,我发现的每个示例似乎都建议使用自己的类扩展面板
是的,您必须扩展JPanel
并覆盖paintcomponent(Graphics g)
函数才能执行此操作
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bgImage, 0, 0, null);
}
我一直在寻找一种方法来简单地添加图像,而不必创建一个全新的类,并且使用相同的方法(尝试保持事物的组织性和简单性)
如果需要,您可以使用其他允许直接将图像添加为图标的组件,例如JLabel
ImageIcon icon = new ImageIcon(imgURL);
JLabel thumb = new JLabel();
thumb.setIcon(icon);
但还是在括号中试图保持事情的条理性和简单性!!是什么让你认为仅仅创建一个新类就会把你带入一个混乱的世界
将图像设置为JPanel背景的最简单方法
不要使用JPanel。只需使用带有图标的JLabel,就不需要自定义代码
有关更多信息以及使用3种不同绘制选项在JPanel上绘制图像的解决方案,请参见:
缩放
瓦片
实际的
在添加到帧的JPanel的背景上绘制图像。使用布局管理器通常将按钮和其他组件添加到面板中。如果添加其他子面板,可能需要设置child.setOpaque(false)
那么,创建自定义JPanel
有什么问题呢?我如何在不创建新类或方法的情况下将背景图像添加到我的JPanel中,但只需将其与JPanel的其他属性一起插入即可?正如我所知,您只能更改颜色或创建类似于您在示例中看到的扩展JPanel的代码注释不应该在下一行吗?“另一种创建第二个自定义JPanel和put的方法(有点复杂)是作为主面板的背景”第二个面板实际上是如何向解决方案发展的?它似乎回到了相同的基本问题(只是在不同的面板中)。@AndrewThompson如果他的主类扩展了其他类,他就不能继承JPanel,因此他可以添加新的自定义JPanel
class Logo extends JPanel
{
Logo()
{
//code
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
ImageIcon img = new ImageIcon("logo.jpg");
g.drawImage(img.getImage(), 0, 0, this.getWidth(), this.getHeight(), null);
}
}