Java 将图像设置为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

我如何将背景图像添加到我的JPanel中而不创建新的类或方法,而只是将其与JPanel的其余属性一起插入

我试图使用图像设置JPanel的背景,但是,我发现的每个示例似乎都建议使用自己的类扩展面板

我一直在寻找一种方法来简单地添加图像,而不创建一个全新的类,并且在同一个方法中(试图保持事情的组织性和简单性)

下面是设置我的JPanel的方法示例:

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);
        }
    }