Изображение JLayeredPane не отображается - PullRequest
0 голосов
/ 22 мая 2018

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

package view;

import javax.swing.*;
import java.awt.*;

/**
 * ImagePanel used to scale and display an image
 */

public class ImagePanel extends JPanel {
private JLayeredPane layeredPane;

/**
 * Setup an ImagePanel, get the image, scale it and set it as a label to display it
 */
public ImagePanel(){

    layeredPane = new JLayeredPane();
    layeredPane.setPreferredSize(new Dimension(300, 300));
    layeredPane.setBorder(BorderFactory.createTitledBorder("Your Pizza"));
    ImageIcon icon = new ImageIcon(getClass().getResource("/images/pizzaboden.png"));
    JLabel imgLabel = new JLabel(icon);
    layeredPane.add(imgLabel);
    add(layeredPane);

}
}

Чтение изображения работает, я читал его раньше, и он работал нормально:

Мое поле данных

private ImageIcon imageIcon;
private ImageIcon scaledImageIcon;
private JLabel imageLabel;
private Image image;
private Image scaledImage;

Мой конструктор

imageIcon = new ImageIcon(getClass().getResource("/images/pizzaboden.png"));
    image = imageIcon.getImage();
    scaledImage = image.getScaledInstance(280, 280, Image.SCALE_SMOOTH);
    scaledImageIcon = new ImageIcon(scaledImage);
    imageLabel = new JLabel(scaledImageIcon);
    add(imageLabel);

Что я получу

1 Ответ

0 голосов
/ 22 мая 2018

Когда вы добавляете что-то в 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);
    }
}
...