简体   繁体   English

java swing - 在同一个 jframe 上绘制多个 jpanel

[英]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. Anywho,我正在尝试创建一个显示 4 个缩略图(在 jpanels 中)和 4 个标题的缩略图查看器。 I can draw out all 4 thumbnails, but they're all the same image (duplicates of the last one painted).我可以绘制所有 4 个缩略图,但它们都是相同的图像(最后一个绘制的副本)。 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. imageAlbum 是 jpg 路径的 ArrayList。

在此处输入图片说明

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: ImageAlbum 类:

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.我显然不是很理解,所以我决定采取不同的方法 - 我正在使用 JLabels 并制作图标。 Works great, thanks everyone for your help效果很好,谢谢大家的帮助

Your panel is set for a BorderLayout, and you call panel.add() for each of your thumbnails.您的panel设置为 BorderLayout,您为每个缩略图调用panel.add() 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 的中间,替换那里的任何内容,这就是为什么您只看到添加的最后一个。 BorderLayout does not do what you want for the thumbnails. BorderLayout 不会为缩略图执行您想要的操作。

I would expect you want GridLayout;我希望你想要 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.将您的panel设置为 GridLayout(或您想要布局缩略图的任何其他内容),并将缩略图添加到其中。 Then put panel wherever you want;然后把panel放在任何你想要的地方; by default, a JFrame has a Borderlayout on it, you probably want to put panel in the middle of that.默认情况下,JFrame 上有一个 Borderlayout,您可能希望将panel放在它的中间。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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