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



如何在不创建新的类或方法的情况下将背景图像添加到我的 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并覆盖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 上的解决方案:

  1. 规模
  2. 平铺
  3. 实际

据我所知,您可以做到这一点的方法是覆盖paintComponent需要继承JPanel的方法

 @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 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 的背景上绘制图像。 通常使用布局管理器将按钮和其他组件添加到面板。 如果添加其他子面板,也许要设置 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();
            }
        });
    }
}
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);
    }
}
初始化

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

最新更新