将图像设置为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。 只需使用带有Icon的JLabel,就可以不需要自定义代码。

有关详细信息,请参阅背景面板以及将在具有3种不同绘画选项的JPanel上绘制图像的解决方案:

  1. 缩放
  2. 瓷砖
  3. 实际

我知道你可以这样做的方法是覆盖要求inheritanceJPanel 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和put的另一种方式(有点复杂)是作为主要的背景

ImagePanel

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

EmptyPanel

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