Вы можете легко перемещать 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();
}
}
}
Вы можете иметь изображения в пакете изображений вне пакета с файлами классов:
![введите здесь описание изображения](https://i.stack.imgur.com/pwFdz.jpg)
Ключевой вопрос здесь заключается в том, где хранятся изображения относительно файлов классов? В моем примере файлы классов хранятся в myPackage, а изображение — в myPackage/images, поэтому относительный путь — это просто изображения. Таким образом, любые изображения в папке изображений должны быть указаны по этому пути, здесь «images/MyImage.jpg», и получены как ресурс, а не как файл.
person
Hovercraft Full Of Eels
schedule
29.06.2012
Graphics
. Было бы легче переместить его - person Joseph Elcid   schedule 30.06.2012