2012-10-23 10 views
7

Mam JPanel w JFrame. I załadowany obrazek na JPanel ale jego pokazanego tylko część obrazu: Jest to część kodu, w którym to zrobiłem:Jak dopasować rozmiar obrazu do rozmiaru JFrame?

JPanel panelImg = new JPanel() 
{ 
    public void paintComponent(Graphics g) 
    { 
     Image img = new ImageIcon("Welcome.png").getImage(); 
     Dimension size = new Dimension(img.getWidth(null), img.getHeight(null)); 
     setPreferredSize(size); 
     setMinimumSize(size); 
     setMaximumSize(size); 
     setSize(size); 
     setLayout(null); 
     g.drawImage(img, 0, 0, null); 
    } 
}; 
mainFrame.add(panelImg); 

Więc tak to wygląda:

Picture 1

kompletny obraz wygląda tak:

enter image description here

Czy istnieje sposób, aby skalować PICT do rozmiaru JFrame? Z góry dziękuję

+2

Wystarczy popatrzeć na niektóre z tych odpowiedzi: http://stackoverflow.com/a/12660146/1133011 i tutaj http://stackoverflow.com/a/12996718/1133011 oboje pokaż jak wyświetlać i skalować obrazy na 'JPanel' /' JFrame'. Będziesz po prostu skalować go teraz do rozmiaru klatki za pomocą 'getWidth()' i 'getHeight()' (+1 do @trashgod i @MadProgrammer) –

Odpowiedz

12

Przede wszystkim, nie będzie ładowania obrazu wewnątrz metody paintComponent, ta metoda jest wywołanie wielokrotnie (i kilka razy w krótkim odstępie czasu), nie chcemy robić niczego, co Potrzeba czasu, aby wykonać lub zużywa zasobów niepotrzebnie

Wyjazd Java: maintaining aspect ratio of JPanel background image sugestie na wypełnienie/obrazy dopasowane do danego obszaru

+0

Dobra uwaga na temat latencji; [obowiązkowy przykład] (http://stackoverflow.com/a/4530659/230513). – trashgod

13

Chcesz, aby drawImage() skalował się do docelowego kontenera. Zobacz artykuł cytowany here dla alternatywy. Na przykład,

g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 
+0

Dzięki temu wypróbowałem pierwszą odpowiedź i działałem idealnie. –

2
import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.JPanel; 

public class ImagePanel extends JPanel { 

    Image image; 

    public void setBackground(Image image) { 
     this.image = image; 
    } 

    @Override 
    public void paintComponent(Graphics G) { 
     super.paintComponent(G); 
     G.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null); 
    } 

} 

Następnie za pomocą metody obiektu ImagePanel SetBackground jak

imagePanel1.SetBackGround(ImageIO.read(new File("extensions/images/background.jpg"))); 
+2

JPanel jest domyślnie nieprzezroczysty. Zatem twoja implementacja paintComponent potencjalnie narusza kontrakt nieprzejrzystości (jeśli obraz nie jest kompletnie nieprzejrzysty). Aby to naprawić, wywołaj super.paintComponent lub ustaw właściwość nieprzezroczystą na false. BTW: Proszę nauczyć się konwencji nazewnictwa java i trzymać się ich. – kleopatra

+0

zrobione: D .. thx: D –

+2

dobra - a teraz naprawić nazewnictwo i uszczęśliwiać mnie :-) – kleopatra

0

można spróbować to:

Image img = new ImageIcon(ImageIO.read(new File("welcome.png")) 
           .getScaledInstance(WIDTH, HEIGHT, Image.SCALE_SMOOTH))); 
1

jej łatwo. Śledź ten przykład,

public class BasePanel extends JPanel { 

ImageIcon backImage; 
public BasePanel() { 
    backImage = new ImageIcon("src/images/welcome.png"); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    BufferedImage scaledImage = getScaledImage(); 
    super.paintComponent(g); 
    g.drawImage(scaledImage, 0, 0, null); 
} 

private BufferedImage getScaledImage(){ 
    BufferedImage image = new BufferedImage(getWidth(),getHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2d = (Graphics2D) image.createGraphics(); 
    g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY)); 
    g2d.drawImage(backImage.getImage(), 0, 0,getWidth(),getHeight(), null); 

    return image; 
} 

} 
Powiązane problemy