Il modo più semplice per impostare l’immagine come sfondo JPanel

Come aggiungerei l’immagine di sfondo al mio JPanel senza creare una nuova class o metodo, ma semplicemente inserendola insieme al resto degli attributi di JPanel?

Sto cercando di impostare lo sfondo di JPanel usando un’immagine, tuttavia, ogni esempio che trovo sembra suggerire di estendere il pannello con la sua class.

Ho cercato un modo per aggiungere semplicemente l’immagine senza creare una class completamente nuova e all’interno dello stesso metodo (cercando di mantenere le cose organizzate e semplici).

Ecco un esempio del metodo che imposta il mio 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; } 

Sto cercando di impostare lo sfondo di JPanel usando un’immagine, tuttavia, ogni esempio che trovo sembra suggerire di estendere il pannello con la sua class

Sì, dovrai estendere JPanel e ignorare la funzione paintcomponent(Graphics g) per farlo.

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

Ho cercato un modo per aggiungere semplicemente l’immagine senza creare una class completamente nuova e all’interno dello stesso metodo ( cercando di mantenere le cose organizzate e semplici ).

È ansible utilizzare un altro componente che consente di aggiungere l’immagine come icona direttamente, ad es. JLabel se lo si desidera.

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

Ma di nuovo nella staffa cercando di mantenere le cose organizzate e semplici !! cosa ti fa pensare che solo la creazione di una nuova class ti porterà in un mondo disordinato?

Il modo più semplice per impostare l’immagine come sfondo JPanel

Non usare un JPanel. Basta usare una JLabel con un’icona, quindi non è necessario il codice personalizzato.

Vedi Pannello di sfondo per ulteriori informazioni e una soluzione che dipingerà l’immagine su un JPanel con 3 diverse opzioni di pittura:

  1. scalato
  2. piastrelle
  3. effettivo

Come so, il modo in cui puoi farlo è sovrascrivere il metodo paintComponent che richiede di ereditare JPanel

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

L’altro modo (un po ‘complicato) per creare un secondo JPanel personalizzato e mettere è come sfondo per il tuo principale

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

Disegna l’immagine sullo sfondo di un JPanel che viene aggiunto al fotogramma. Utilizzare un gestore di layout per aggiungere normalmente i pulsanti e altri componenti al pannello. Se aggiungi altri pannelli secondari, forse vuoi impostare 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(); } }); } }