2010-02-09 15 views
5

Ich benutze JFrame und ich habe ein Hintergrundbild auf meinem Rahmen gehalten. Jetzt ist das Problem, dass die Größe des Bildes kleiner als die Größe des Rahmens ist, also muss ich das gleiche Bild noch einmal auf dem leeren Teil des Fensters behalten. Wenn der Benutzer auf die Schaltfläche "Maximieren" klickt, muss ich das Bild möglicherweise zur Laufzeit in einen leeren Bereich des Rahmens setzen. Kann mir jemand sagen, wie ich das erreichen soll?Java Swing Hintergrundbild

+2

„i das gleiche Bild zu halten, haben noch einmal auf den leeren Teil“ doesn Für mich ergibt das keinen Sinn. Kannst du bitte ein Bild mit dem, was du hast und was du willst, erstellen? –

Antwort

1

Sie möchten etwas wie das Hintergrundbild des Windows-Desktops, wenn Sie das Hintergrundbild mehrmals verwenden anstatt es zu skalieren oder es nur zentriert anzuzeigen?

Sie müssen das Bild nur einmal speichern und in der paintComponent-Methode nur mehrmals malen.

+0

Können Sie mir einen Beispielcode dafür geben? Wenn Sie haben. Es wird mir eine große Hilfe sein. Bitte? – Nilesh

+0

Sehen Sie das Beispiel von finnw –

12

Es klingt, als ob Sie über Tiling vs. Stretching sprechen, obwohl es nicht klar ist, welches Verhalten Sie wollen.

Dieses Programm hat Beispiele für beide:

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

Vielen Dank für Ihre Antwort seine Arbeit ... – Nilesh

+0

Hallo, haben Sie irgendwelche Empfehlungen für das Kacheln des Bildes, anstatt es zu dehnen, um die Qualität des Bildes zu erhalten? – NumenorForLife

0

andere Art und Weise zu Kachel ein Bild mit 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())); 
    } 
}