2010-02-09 4 views
5

Sto usando JFrame e ho mantenuto un'immagine di sfondo sul mio frame. Ora il problema è che la dimensione dell'immagine è minore della dimensione della cornice, quindi devo mantenere la stessa immagine ancora una volta sulla parte vuota della finestra. Se l'utente fa clic sul pulsante di ingrandimento di quello che potrebbe essere necessario mettere l'immagine sulla regione vuota del frame in fase di esecuzione. Qualcuno può dirmi come farlo?java swing background image

+2

"devo mantenere la stessa immagine nuovamente la parte vuota" doesn ho senso per me. Puoi creare un'immagine con quello che hai e quello che vuoi, per favore? –

risposta

1

Vuoi qualcosa come l'immagine di sfondo del desktop di Windows, quando usi l'immagine di sfondo più volte invece di ridimensionarla o semplicemente visualizzarla centrata?

È sufficiente mantenere l'immagine una sola volta e dipingerla più volte nel metodo paintComponent.

+0

Puoi darmi un codice di esempio per questo. se hai. Sarà di grande aiuto per me. Per favore? – Nilesh

+0

Vedere l'esempio di finnw –

12

Sembra che si parli di affiancamento o allungamento, anche se non è chiaro quale comportamento si desidera.

Questo programma ha esempi sia:

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

Grazie mille per la risposta al suo lavoro ... – Nilesh

+0

Ciao, hai qualche suggerimento su come piastrellare l'immagine, invece di allungarla, al fine di mantenere la qualità dell'immagine? – NumenorForLife

0

Un altro modo per piastrelle un'immagine è 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())); 
    } 
}