Imagen de fondo de java swing

Estoy usando JFrame y he conservado una imagen de fondo en mi marco. Ahora el problema es que el tamaño de la imagen es más pequeño que el tamaño del marco, así que tengo que mantener la misma imagen una vez más en la parte vacía de la ventana. Si el usuario hace clic en el botón Maximizar, es posible que deba poner la imagen en la región vacía del marco en tiempo de ejecución. ¿Alguien puede decirme cómo lograr esto?

¿Desea algo como la imagen de fondo del escritorio de Windows, cuando usa la imagen de fondo varias veces en lugar de cambiar el tamaño o simplemente lo muestra centrado?

Solo tiene que conservar la imagen una vez y simplemente pintarla varias veces en el método paintComponent.

Suena como si estuvieras hablando de mosaico vs. estiramiento, aunque no está claro qué comportamiento deseas.

Este progtwig tiene ejemplos de ambos:

import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.AbstractAction; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JPanel; public class Main { public static void main(String[] args) throws IOException { final Image image = ImageIO.read(new URL("http://sstatic.net/so/img/logo.png")); final JFrame frame = new JFrame(); frame.add(new ImagePanel(image)); frame.setSize(800, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } @SuppressWarnings("serial") class ImagePanel extends JPanel { private Image image; private boolean tile; ImagePanel(Image image) { this.image = image; this.tile = false; final JCheckBox checkBox = new JCheckBox(); checkBox.setAction(new AbstractAction("Tile") { public void actionPerformed(ActionEvent e) { tile = checkBox.isSelected(); repaint(); } }); add(checkBox, BorderLayout.SOUTH); }; @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (tile) { int iw = image.getWidth(this); int ih = image.getHeight(this); if (iw > 0 && ih > 0) { for (int x = 0; x < getWidth(); x += iw) { for (int y = 0; y < getHeight(); y += ih) { g.drawImage(image, x, y, iw, ih, this); } } } } else { g.drawImage(image, 0, 0, getWidth(), getHeight(), this); } } } 

Otra forma de TexturePaint una imagen en mosaico es con TexturePaint :

 public class TexturePanel extends JPanel { private TexturePaint paint; public TexturePanel(BufferedImage bi) { super(); this.paint = new TexturePaint(bi, new Rectangle(0, 0, bi.getWidth(), bi.getHeight())); } @Override protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setPaint(paint); g2.fill(new Rectangle(0, 0, getWidth(), getHeight())); } }