2010-02-09 6 views
5

J'utilise JFrame et j'ai gardé une image de fond sur mon cadre. Maintenant, le problème est que la taille de l'image est plus petite que la taille de la trame, donc je dois garder la même image une fois de plus sur la partie vide de la fenêtre. Si l'utilisateur clique sur le bouton agrandir, il se peut que je doive placer l'image sur une zone vide de la trame au moment de l'exécution. Quelqu'un peut-il me dire comment accomplir cela?java swing image de fond

+2

« Je dois garder la même image une nouvelle fois sur la partie vide » doesn n'a pas de sens pour moi. Pouvez-vous créer une image avec ce que vous avez et ce que vous voulez, s'il vous plaît? –

Répondre

1

Vous voulez quelque chose comme l'image d'arrière-plan du bureau de Windows, lorsque vous utilisez plusieurs fois l'image d'arrière-plan au lieu de la redimensionner ou simplement l'afficher au centre?

Vous ne devez conserver l'image qu'une seule fois et la peindre plusieurs fois dans la méthode paintComponent.

+0

Pouvez-vous me donner un exemple de code pour cela. si tu as. Ce sera une aide précieuse pour moi. S'il vous plaît? – Nilesh

+0

Voir l'exemple de finnw –

12

Il semble que vous parliez de carrelage par rapport à l'étirement, bien que le comportement souhaité ne soit pas clair.

Ce programme a des exemples à la fois:

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

Merci beaucoup pour votre réponse son fonctionnement ... – Nilesh

+0

Salut, avez-vous des recommandations sur la façon de mosaïquer l'image, au lieu de l'étirer, afin de maintenir la qualité de l'image? – NumenorForLife

0

Une autre façon de paver une image est avec 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())); 
    } 
}