Maneira mais simples de definir imagens como fundo JPanel

Como eu adicionaria a imagem backgroung ao meu JPanel sem criar uma nova class ou método, mas simplesmente inserindo-o junto com o restante dos atributos do JPanel?

Eu estou tentando definir o plano de fundo de um JPanel usando uma imagem, no entanto, cada exemplo que eu encontro parece sugerir estender o painel com sua própria class.

Eu tenho procurado uma maneira de simplesmente adicionar a imagem sem criar uma nova class e dentro do mesmo método (tentando manter as coisas organizadas e simples).

Aqui está um exemplo do método que define o meu 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; } 

Eu estou tentando definir o plano de fundo do JPanel usando uma imagem, no entanto, cada exemplo que eu encontro parece sugerir estender o painel com sua própria class

sim você terá que estender o JPanel e replace a function paintcomponent(Graphics g) para fazer isso.

 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(bgImage, 0, 0, null); } 

Eu tenho procurado uma maneira de simplesmente adicionar a imagem sem criar uma nova class e dentro do mesmo método ( tentando manter as coisas organizadas e simples ).

Você pode usar outro componente que permite adicionar imagem como ícone diretamente, por exemplo, JLabel se você quiser.

 ImageIcon icon = new ImageIcon(imgURL); JLabel thumb = new JLabel(); thumb.setIcon(icon); 

Mas novamente no suporte tentando manter as coisas organizadas e simples !! O que faz você pensar que apenas criar uma nova class o levará a um mundo confuso?

Maneira mais simples de definir imagens como fundo JPanel

Não use um JPanel. Basta usar um JLabel com um ícone, então você não precisa de código personalizado.

Veja o Painel de Fundo para mais informações, bem como uma solução que irá pintar a imagem em um JPanel com 3 opções diferentes de pintura:

  1. dimensionado
  2. telhada
  3. real

Como eu sei, o jeito que você pode fazer é sobrescrever o método paintComponent que exige herdar JPanel

  @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // paint the background image and scale it to fill the entire space g.drawImage(/*....*/); } 

O outro caminho (um pouco complicado) para criar segundo JPanel personalizado e colocar é como pano de fundo para o seu principal

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

Desenhe a imagem no plano de fundo de um JPanel adicionado ao quadro. Use um gerenciador de layout para adicionar normalmente seus botões e outros componentes ao painel. Se você adicionar outros painéis filhos, talvez queira definir 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(); } }); } }