Проблема с добавлением изображения в JPanel

Я делаю видеоигру, и мне нужно добавить изображение в JPanel, а затем добавить этот JPanel в JFrame. Все учебники, которые я видел, говорят, что нужно добавить его в JLabel, но изображение должно иметь возможность перемещаться. Если вы не можете перемещать JLabel, я не могу этого сделать. Как я могу добавить изображение непосредственно в JPanel. Это то, что у меня есть до сих пор, но это так же, как это было на JApplet

class Penguin extends JPanel {

    public Image image;

    public void paintComponent( Graphics g ) {

        image = getImage( getDocumentBase(), "Penguins.jpg" );
        g.drawImage( image, 0, 0, this );
    }
}

person kullalok    schedule 29.06.2012    source источник
comment
Почему бы не использовать графику из Graphics. Было бы легче переместить его   -  person Joseph Elcid    schedule 30.06.2012
comment
Попробуйте это: чтобы добавить изображение в jpanel"> stackoverflow.com/questions/299495/   -  person Branislav Lazic    schedule 30.06.2012
comment
@brano88: тебе не кажется, что одного коммента достаточно?   -  person Hovercraft Full Of Eels    schedule 30.06.2012
comment
См. Редактировать 2, чтобы ответить.   -  person Hovercraft Full Of Eels    schedule 30.06.2012


Ответы (1)


Вы можете легко перемещать JLabel, так что это все еще жизнеспособный вариант, и есть доступные приемы, которые позволяют вам сделать это, включая использование JLayeredPane или стеклянной панели. Но, сказав это, нарисовать изображение в JPanel все же несложно (и я уверен, что ваш поиск в Google показал вам, как это сделать). Ключ заключается в том, чтобы нарисовать его с помощью метода drawImage(...) объекта Graphics в переопределении метода paintComponent(...) JPanel.

Мы, вероятно, сможем дать вам гораздо лучший и более конкретный совет, если вы пожелаете, если вы предоставите нам более подробную информацию о вашем текущем коде и ваших текущих проблемах.

Изменить:
Что касается вашего опубликованного кода: во-первых, не читайте файл в методе paintComponent(...). Это замедлит отрисовку вашего графического интерфейса и сделает реакцию вашего графического интерфейса ужасной. Кроме того, почему ваш код перечитывается в одном и том же файле изображения каждый раз, когда происходит перерисовка? Нет, вместо этого прочитайте файл один раз и сохраните его в переменной изображения. Возможно, вам следует прочитать его при использовании ImageIO.read(...).

Затем вам все равно нужно переместить файл в файл jar, как было рекомендовано вам ранее.

Редактировать 2:
Например, с таким кодом:

Пингвин.java

package myPackage;

import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Penguin extends JPanel {
   private Image image;

   public Penguin(String imageResource) throws IOException {
      InputStream inStream = getClass().getResourceAsStream(imageResource);
      image = ImageIO.read(inStream);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (image != null) {
         g.drawImage(image, 0, 0, this);
      }
   }
}

PenguinApplet.java

package myPackage;

import java.awt.BorderLayout;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;

@SuppressWarnings("serial")
public class PenguinApplet extends JApplet {
   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               createAndShowGui();
            }
         });
      } catch (InterruptedException e) {
         e.printStackTrace();
      } catch (InvocationTargetException e) {
         e.printStackTrace();
      }
   }

   public void createAndShowGui() {
      String penguinImgResource = "images/MyImage.jpg";
      try {
         Penguin penguinPanel = new Penguin(penguinImgResource );
         getContentPane().add(penguinPanel, BorderLayout.CENTER);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Вы можете иметь изображения в пакете изображений вне пакета с файлами классов:

введите здесь описание изображения

Ключевой вопрос здесь заключается в том, где хранятся изображения относительно файлов классов? В моем примере файлы классов хранятся в myPackage, а изображение — в myPackage/images, поэтому относительный путь — это просто изображения. Таким образом, любые изображения в папке изображений должны быть указаны по этому пути, здесь «images/MyImage.jpg», и получены как ресурс, а не как файл.

person Hovercraft Full Of Eels    schedule 29.06.2012
comment
Думаю, я забыл упомянуть, что это должно быть на JFrame... может ли это работать и на JFrame? - person kullalok; 30.06.2012
comment
@ user1276078: да, концепция точно такая же, и код похож. - person Hovercraft Full Of Eels; 30.06.2012
comment
@ user1276078: Да, вы не хотите invokeAndWait(...) для JFrame, а скорее invokeLater(...). - person Hovercraft Full Of Eels; 30.06.2012
comment
БОЛЬШОЕ СПАСИБО, вы даже не представляете, как сильно вы мне сейчас помогли :) - person kullalok; 30.06.2012