Когда вы добавляете что-то в JLayeredPane, вам нужно указать, где компонент добавляется в измерении X / Y, а также где в многослойном измерении, согласно учебнику JLayeredPane , и выне делай этогоВам также необходимо указать размер JLabel, так как его предпочтительный размер не учитывается JLayeredPane.Что-то вроде
imgLabel.setSize(imgLabel.getPreferredSize());
imgLabel.setPosition(0, 0);
layeredPane.add(imgLabel, JLayeredPane.DEFAULT_LAYER);
может быть адекватным.
Кроме того, проверяли ли вы независимо от этой текущей программы, чтобы убедиться, что изображение читается соответствующим образом?Кроме того, вы добавляете в FlowLayout с помощью JPanel - вы уверены, что хотите это сделать?Возможно, лучше было бы дать вашей ImagePanel BorderLayout.
Обратите внимание, что если бы я делал что-то подобное, показывал несколько перекрывающихся изображений в Swing GUI, я бы не использовал JLayeredPane, а вместо этого рисовал бы изображения (BufferedImages) в методе paintComponent(Graphics g)
один рисунок JPanel, и я при желании добавляю и удаляю изображения из графического интерфейса пользователя, а затем вызываю repaint()
на чертеже JPanel.
Например, если вы предоставляете чертежу JPanel ArrayList изображений, например,:
private List<Image> images = new ArrayList<>();
Вы можете рисовать любые изображения, содержащиеся в этом списке, просматривая список в методе paintComponent:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Image image : images) {
g.drawImage(image, 0, 0, this);
}
}
И вы можете легко добавлять и удалять изображения:
public void clearImages() {
images.clear();
repaint();
}
public void removeImage(Image image) {
images.remove(image);
repaint();
}
public void addImage(Image image) {
images.add(image);
repaint();
}
Например, вот код проверки концепции, который вы можете запустить, который демонстрирует, что я имею в виду:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.*;
public class MultipleImages extends JPanel {
private static final String BULLS_EYE_PATH = "https://upload.wikimedia.org/wikipedia/"
+ "commons/thumb/3/36/Roundel_of_the_Serbian_Air_Force_1915.svg/"
+ "300px-Roundel_of_the_Serbian_Air_Force_1915.svg.png";
private static final String CHINESE_CHAR_PATH = "https://upload.wikimedia.org/"
+ "wikipedia/commons/1/1a/%E9%9D%91-red.png";
private static final String HOCKY_PATH = "https://upload.wikimedia.org/wikipedia/"
+ "commons/thumb/e/eb/Ice_hockey_pictogram.svg/"
+ "300px-Ice_hockey_pictogram.svg.png";
private static final String[] LABELS = {"Bulls Eye", "Chinese Character", "Hockey"};
private static final String[] IMAGE_PATHS = {BULLS_EYE_PATH, CHINESE_CHAR_PATH, HOCKY_PATH};
private Map<String, Image> imageMap = new HashMap<>();
private List<JCheckBox> checkBoxes = new ArrayList<>();
private ImagePanel imagePanel = new ImagePanel();
public MultipleImages() throws IOException {
for (int i = 0; i < IMAGE_PATHS.length; i++) {
URL imgUrl = new URL(IMAGE_PATHS[i]);
BufferedImage img = ImageIO.read(imgUrl);
imageMap.put(LABELS[i], img);
}
ActionListener checkBoxListener = e -> {
imagePanel.clearImages();
for (JCheckBox checkBox : checkBoxes) {
if (checkBox.isSelected()) {
String label = checkBox.getActionCommand();
imagePanel.addImage(imageMap.get(label));
}
}
imagePanel.repaint();
};
JPanel checkBoxPanel = new JPanel(new GridLayout(0, 1));
for (String label : LABELS) {
JCheckBox checkBox = new JCheckBox(label);
checkBox.setActionCommand(label);
checkBoxes.add(checkBox);
checkBoxPanel.add(checkBox);
checkBox.addActionListener(checkBoxListener);
}
JPanel rightPanel = new JPanel(new BorderLayout());
rightPanel.add(checkBoxPanel, BorderLayout.PAGE_START);
setLayout(new BorderLayout());
add(rightPanel, BorderLayout.LINE_START);
add(imagePanel);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Multiple Images");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
frame.getContentPane().add(new MultipleImages());
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
public class ImagePanel extends JPanel {
private static final int PREF_W = 300;
private static final int PREF_H = PREF_W;
private static final Color BACKGROUND = Color.WHITE;
private List<Image> images = new ArrayList<>();
public ImagePanel() {
setBackground(BACKGROUND);
setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Image image : images) {
g.drawImage(image, 0, 0, this);
}
}
public void clearImages() {
images.clear();
repaint();
}
public void removeImage(Image image) {
images.remove(image);
repaint();
}
public void addImage(Image image) {
images.add(image);
repaint();
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
}