简体   繁体   中英

java swing - painting multiple jpanels on the same jframe

Just to preface, I've looked for several hours trying to find a solution to this on here and several other sites. If you find a question I may have missed, please let me know.

Anywho, I'm trying to create a thumbnail viewer that displays 4 thumbnails (in jpanels) and 4 captions. I can draw out all 4 thumbnails, but they're all the same image (duplicates of the last one painted). I think it's part of how I'm trying to repaint them, but I can't figure out what to change. The imageAlbum is an ArrayList of jpg paths.

在此处输入图片说明

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

//import MainFrame.ImageComponent;

import javax.swing.JLabel;

public class Thumbnails extends JFrame {
    final int IMG_WIDTH = 80;
    final int IMG_HEIGHT = 60;
    private BufferedImage image;
    private ImageAlbum imageAlbum;
    private JPanel contentPane;
    private JPanel thmbnl_1;
    private JPanel thmbnl_2;
    private JPanel thmbnl_3;
    private JPanel thmbnl_4;
    private JLabel thmbnl_1Label;
    private JLabel thmbnl_2Label;
    private JLabel thmbnl_3Label;
    private JLabel thmbnl_4Label;

    /**
     * Create the frame.
     */
    public Thumbnails(ImageAlbum album) {
        imageAlbum = album;
        String captionUnavailable = "Caption is not available";

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.CENTER);
        panel.setLayout(new GridLayout(4, 2, 0, 0));

        thmbnl_1 = new JPanel();
        thmbnl_1.setPreferredSize(new Dimension(80, 60));
        panel.add(thmbnl_1);

        thmbnl_2 = new JPanel();
        thmbnl_2.setPreferredSize(new Dimension(80, 60));
        panel.add(thmbnl_2);

        thmbnl_1Label = new JLabel(captionUnavailable);
        panel.add(thmbnl_1Label);

        thmbnl_2Label = new JLabel(captionUnavailable);
        panel.add(thmbnl_2Label);

        thmbnl_3 = new JPanel();
        thmbnl_3.setPreferredSize(new Dimension(IMG_WIDTH, IMG_HEIGHT));
        panel.add(thmbnl_3);

        thmbnl_4 = new JPanel();
        thmbnl_4.setPreferredSize(new Dimension(IMG_WIDTH, IMG_HEIGHT));
        panel.add(thmbnl_4);

        thmbnl_3Label = new JLabel(captionUnavailable);
        panel.add(thmbnl_3Label);

        thmbnl_4Label = new JLabel(captionUnavailable);
        panel.add(thmbnl_4Label);

        setupThumbnails();
    }// end Thumbnails(ImageAlbum album)


    // 
    private void setupThumbnails() {
        int albumSize = imageAlbum.getSize();

        for(int i = 0; i < albumSize; i++) {
            try {           
                image = resizeToThumbnail(ImageIO.read(new File(imageAlbum.getAlbum(i))));

                switch(i) {
                    case 0:
                        thmbnl_1.setLayout(new BorderLayout());
                        thmbnl_1.add(new ImageComponent(image), BorderLayout.CENTER);
                        thmbnl_1Label.setText(imageAlbum.getCaption(i));
                        break;
                    case 1:
                        thmbnl_2.setLayout(new BorderLayout());
                        thmbnl_2.add(new ImageComponent(image), BorderLayout.CENTER);
                        thmbnl_2Label.setText(imageAlbum.getCaption(i));
                        break;
                    case 2:
                        thmbnl_3.setLayout(new BorderLayout());
                        thmbnl_3.add(new ImageComponent(image), BorderLayout.CENTER);
                        thmbnl_3Label.setText(imageAlbum.getCaption(i));
                        break;
                    case 3:
                        thmbnl_4.setLayout(new BorderLayout());
                        thmbnl_4.add(new ImageComponent(image), BorderLayout.CENTER);
                        thmbnl_4Label.setText(imageAlbum.getCaption(i));
                        break;
                    default:
                        break;
                }// end switch-case

                revalidate();
                repaint();              
            }// end try-block
            catch(IOException e) {
                e.printStackTrace();
            }// end catch-block
        }// end for-loop
    }// end setupCaptions()


    // 
    public BufferedImage resizeToThumbnail(BufferedImage original) {
        int type;
        BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, original.getType());
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(original, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
        g.dispose();
        g.setComposite(AlphaComposite.Src);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

        return resizedImage;
    }// end resizeToThumbnail(...)


    class ImageComponent extends JComponent {
        /**
         * Desc: constructor for ImageComponent
         * @param: BufferedImage img
         * @return: nothing
         */
        public ImageComponent(BufferedImage img) {
            image = img;
        }// end ImageComponent()


        /**
         * Desc: draws out the image to the panel
         * @param: Graphics g
         * @return: void
         */
        @Override
        public void paintComponent(Graphics g) {
            if(image == null)
                return;

            Graphics2D g2d = (Graphics2D) g;

            // draw the image
            g.drawImage(image, 0, 0, this);
            g.dispose();
        }// end paintComponents(Graphics g)
    }// end class ImageComponent
}// end class class Thumbnails

EDIT

ImageAlbum class:

import java.util.*;


public class ImageAlbum {
    private ArrayList imageAlbum;
    private ArrayList imageCaptions;
    private int size;


    /**
     * Desc: getter for album size
     * @param: none
     * @return: int
     */
    public int getSize() {
        return size;
    }// end getSize()


    /**
     * Desc: getter for the image
     * @param: int index
     * @return: String
     */
    public String getAlbum(int index) {
        return imageAlbum.get(index).toString();
    }// end getAlbum(int index)



    /**
     * Desc: getter for the image caption
     * @param: int index
     * @return: String
     */
    public String getCaption(int index) {
        return imageCaptions.get(index).toString();
    }// end getCaption(int index)


    /**
     * Desc: default constructor for ImageAlbum
     * @param: none
     * @return: nothing
     */
    public ImageAlbum() {
        imageAlbum = new ArrayList();
        imageCaptions = new ArrayList();
        size = 0;
    }// end ImageAlbum()


    /**
     * Desc: parameterized constructor for ImageAlbum
     * @param: none
     * @return: nothing
     */
    public ImageAlbum(ArrayList tempImageAlbum, ArrayList tempImageCaptions) {
        imageAlbum = tempImageAlbum;
        imageCaptions = tempImageCaptions;
    }// end ImageAlbum(...)


    /**
     * Desc: adds the image directory and caption to both array lists
     * @param: String imageDirectory, String imageCaption
     * @return: void
     */
    public void add(String imageDirectory, String imageCaption) {
        imageAlbum.add(imageDirectory);
        imageCaptions.add(imageCaption);
        size++;
    }// end add(...)


    /**
     * Desc: clears imageAlbum and imageCaptions array lists
     * @param: nothing
     * @return: void
     */
    public void clear() {
        imageAlbum.clear();
        imageCaptions.clear();
        size = 0;
    }// end clear()
}// end class ImageAlbum

FINAL EDIT

I'm obviously not understanding very well, so I've decided to take a different approach - I'm using JLabels and doing icons instead. Works great, thanks everyone for your help

Your panel is set for a BorderLayout, and you call panel.add() for each of your thumbnails. That method sets the given component into the middle of the BorderLayout, replacing whatever is there, so that's why you're just seeing the last one added. BorderLayout does not do what you want for the thumbnails.

I would expect you want GridLayout; it lays out components added to it in rows and columns. Set your panel to GridLayout (or whatever else you want to layout the thumbnails), and add the thumbnails to it. Then put panel wherever you want; by default, a JFrame has a Borderlayout on it, you probably want to put panel in the middle of that.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM