将图像设置为 JPanel 背景的最简单方法

Posted

技术标签:

【中文标题】将图像设置为 JPanel 背景的最简单方法【英文标题】:Simplest way to set image as JPanel background 【发布时间】:2013-10-08 04:11:54 【问题描述】:

如何在不创建新类或方法的情况下将背景图像添加到我的 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有什么问题? 如何在不创建新类或方法的情况下将背景图像添加到我的 JPanel,而只需将其与 JPanel 的其余属性一起插入? 据我所知,您只能更改颜色或像您看到的示例中那样创建 extends JPanel :) 【参考方案1】:

我正在尝试使用图像设置 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);

但又是在括号中试图让事情保持井井有条!是什么让你认为仅仅创建一个新班级就会把你带到一个混乱的世界?

【讨论】:

【参考方案2】:

将图像设置为JPanel背景的最简单方法

不要使用 JPanel。只需使用带有图标的 JLabel,就不需要自定义代码。

请参阅Background Panel 了解更多信息以及使用 3 种不同绘制选项在 JPanel 上绘制图像的解决方案:

    缩放 平铺 实际

【讨论】:

【参考方案3】:

据我所知,您可以这样做的方法是覆盖需要继承 JPanelpaintComponent 方法

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


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 并将其作为主面板的背景的另一种方法(有点复杂)”“第二个面板”实际上是如何朝着解决方案发展的?似乎又回到了相同的基本问题(只是在不同的面板中)。 @AndrewThompson 如果他的主类扩展了其他类,他不能从JPanel继承,因此他可以添加新的自定义JPanel【参考方案4】:

在添加到框架的 JPanel 的背景上绘制图像。使用布局管理器通常将您的按钮和其他组件添加到面板。如果你添加其他子面板,也许你想设置 child.setOpaque(false)。

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.net.URL;

public class BackgroundImageApp 
    private JFrame frame;

    private BackgroundImageApp create() 
        frame = createFrame();
        frame.getContentPane().add(createContent());

        return this;
    

    private JFrame createFrame() 
        JFrame frame = new JFrame(getClass().getName());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        return frame;
    

    private void show() 
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    

    private Component createContent() 
        final Image image = requestImage();

        JPanel panel = new JPanel() 
            @Override
            protected void paintComponent(Graphics g) 
                super.paintComponent(g);
                g.drawImage(image, 0, 0, null);
            
        ;

        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        for (String label : new String[]"One", "Dois", "Drei", "Quatro", "Peace") 
            JButton button = new JButton(label);
            button.setAlignmentX(Component.CENTER_ALIGNMENT);
            panel.add(Box.createRigidArea(new Dimension(15, 15)));
            panel.add(button);
        

        panel.setPreferredSize(new Dimension(500, 500));

        return panel;
    

    private Image requestImage() 
        Image image = null;

        try 
            image = ImageIO.read(new URL("http://www.johnlennon.com/wp-content/themes/jl/images/home-gallery/2.jpg"));
         catch (IOException e) 
            e.printStackTrace();
        

        return image;
    

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable() 
            @Override
            public void run() 
                new BackgroundImageApp().create().show();
            
        );
    

【讨论】:

【参考方案5】:
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);
    

【讨论】:

【参考方案6】:

如下初始化您的 JPANEL。注意缺少的分号.. 而是打开一个花括号,然后覆盖该方法.. 这样您就不必扩展任何内容

  ImageIcon img = new ImageIcon("background.jpg");
  JPanel panel1 = new JPanel()
  
     @Override
     protected void paintComponent(Graphics g)
     
        super.paintComponent(g);
        g.drawImage(img.getImage(), 0, 0, null);
     
  ;

【讨论】:

【参考方案7】:
public demo1() 
    initComponents();
    ImageIcon img = new ImageIcon("C:\\Users\\AMIT TIWARI\\Documents\\NetBeansProjects\\try\\src\\com\\dd.jpeg"); //full path of image
    Image img2 = img.getImage().getScaledInstance(mylabel.getWidth(), mylabel.getHeight(),1);
    ImageIcon img3 = new ImageIcon(img2);
    mylabel.setIcon(img3);

【讨论】:

以上是关于将图像设置为 JPanel 背景的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

如何设置JPanel的透明背景?

如何在 netbeans 中为 JPanel 设置背景图像? [复制]

用户将图像上传到服务器,图像设置为div的背景图像

jPanel 的背景图像不起作用

为什么我的JPanel背景颜色不会改变?

为应用程序设置背景图像 - Ionic 4