2013-07-25 3 views
11

Как рисовать изображение в JPanel или JFrame, я уже прочитал учебник оракула по этому вопросу, но я не могу понять, как это правильно. Мне нужно изображение «BeachRoad.png» для отображения в определенном наборе координат. Вот что я до сих пор.Как рисовать изображение в JPanel или 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); 
} 

И в Main(),

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

Заранее спасибо!

+1

ваш код прямой путь к бедах или как ненавидеть языков программирования (whatever.getGraphics()) 1. Пожалуйста, читать Oracle учебник [Работа с Imag es] (http://docs.oracle.com/javase/tutorial/2d/images/index.html), поиск здесь, в сообщениях, отмеченных 'paintComponent' или' JLabel' с 'Icon' /' ImageIcon' – mKorbel

+0

Я уже в первой части вопроса было сказано, что я прочитал учебник «Оракула» по работе с изображениями. И я не могу понять первое, что вы сказали .... – Saucymeatman

+0

см. Ответ от @tieTYT, чтобы начать с paintComponent (забыл о paint()) и JPanel, требуется oto override getPreferredSize (забыл о JFrame.setSize()) для JPanel, а затем вызовите JFrame.pack() (поиск здесь, половина вопросов о paiting Image, Shapes, Line) – mKorbel

ответ

16

Попробуйте это:

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

Спасибо, много! Только то, что я искал. Я очень новичок в использовании изображений в java и полностью потерян. – Saucymeatman

+0

Не могли бы вы показать пример того, как будет вызван метод paintComponent? Похоже, что это будет pane.paintComponent(), но я не понимаю, какой аргумент будет передан ему для g. – redeagle47

+0

@ redeagle47 это хороший вопрос, но, к сожалению, я не знаю ответа (или я забыл). Это просто контракт, который вы обещаете Swing, который вы реализуете. Детали того, как вы получаете этот 'g', поступают из внутренних элементов Swing, а не из любого кода, который вы пишете. Swing отображает «JPanel» и вызывает «paintComponent», когда он это делает. Если вы переопределите этот метод, он потянет его за собой, а не по умолчанию. –

3

Есть много способов, но я всегда переопределить paint(Graphics g) из в JComponent и использовать g.drawImage(...)

редактировать: я делал выборку, но tieTYT сделал это отлично, смотреть на его ответ :)

Смежные вопросы