2013-07-25 10 views
11

Jak narysować obraz do JPanel lub JFrame, już przeczytałem tutorial oracle'a na ten temat, ale nie mogę tego naprawić. Potrzebuję obrazu "BeachRoad.png", który będzie wyświetlany na określonym zestawie współrzędnych. Oto, co mam do tej pory.Jak narysować obraz w JPanel lub JFrame?

public class Level1 extends JFrame implements ActionListener { 

static JLayeredPane EverythingButPlayer; 
static Level1 l1; 

public Level1() { 
    EverythingButPlayer = new JLayeredPane(); 

    BufferedImage img = null; 
    try { 
     img = ImageIO.read(new File("BeachRoad.png")); 
    } catch (IOException e) { 
    } 
    Graphics g = img.getGraphics(); 
    g.drawImage(img,0, 0, EverythingButPlayer); 


    this.add(EverythingButPlayer); 
} 

A w main(),

 l1 = new Level1(); 
    l1.setTitle("poop"); 
    l1.setSize(1920, 1080); 
    l1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    l1.setVisible(true); 

Z góry dzięki!

+1

kod jest bezpośrednia droga do kłopotów i jak nienawidzić języków programowania (whatever.getGraphics()) 1. proszę czytać poradnik Oracle [Praca z Imag es] (http://docs.oracle.com/javase/tutorial/2d/images/index.html), szukaj tutaj w postach oznaczonych przez 'paintComponent' lub' JLabel' z 'Icon' /' ImageIcon' – mKorbel

+0

Ja już w pierwszej części pytania przeczytałem podręcznik Oracles dotyczący pracy z obrazami. I naprawdę nie mogę zrozumieć pierwszej rzeczy, którą powiedziałeś ... – Saucymeatman

+0

zobacz odpowiedź @tieTYT, aby zacząć od paintComponent (zapomniałeś o paint()) i JPanelu, wymagane jest zastąpienie getPreferredSize (zapomniałem o JFrame.setSize()) dla JPanel, a następnie wywołaj JFrame.pack() (szukaj tutaj, połowa pytań na temat malowania obrazu, kształtów, linii) – mKorbel

Odpowiedz

16

Spróbuj tego:

package com.sandbox; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

public class SwingSandbox { 

    public static void main(String[] args) throws IOException { 
     JFrame frame = buildFrame(); 

     final BufferedImage image = ImageIO.read(new File("C:\\Projects\\MavenSandbox\\src\\main\\resources\\img.jpg")); 

     JPanel pane = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.drawImage(image, 0, 0, null); 
      } 
     }; 


     frame.add(pane); 
    } 


    private static JFrame buildFrame() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
     return frame; 
    } 


} 
+1

Dziękuję bardzo! Właśnie tego szukałem. Jestem bardzo nowy w używaniu obrazów w Javie i zostałem całkowicie zagubiony. – Saucymeatman

+0

Czy możesz pokazać przykład tego, jak wywoływana byłaby metoda paintComponent? Wygląda na to, że byłby to pane.paintComponent(), ale nie rozumiem, jaki argument byłby przekazywany do niego przez g. – redeagle47

+0

@ redeagle47 to dobre pytanie, ale niestety nie znam odpowiedzi (lub zapomniałem). Jest to po prostu kontrakt, który obiecujesz Swingowi. Szczegóły tego, jak uzyskujesz 'g' pochodzi z wewnętrznych Swing, a nie z kodu, który piszesz. Swing renderuje 'JPanel' i wywołuje' paintComponent' kiedy to robi. Jeśli przesłonisz tę metodę, narysujesz ją w sposób inny niż domyślny. –

3

Istnieje wiele sposobów, ale zawsze przesłonić paint(Graphics g) o JComponent i używać g.drawImage(...)

edit: Robiłem próby, ale tieTYT zrobił to doskonale, spojrzeć na jego odpowiedź :)