>Java >java지도 시간 >JScrollPane 내의 Java 그리드 레이아웃에 많은 수의 이미지 축소판을 효율적으로 표시하는 방법은 무엇입니까?

JScrollPane 내의 Java 그리드 레이아웃에 많은 수의 이미지 축소판을 효율적으로 표시하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-28 20:37:13866검색

How to Efficiently Display a Large Number of Image Thumbnails in a Java Grid Layout within a JScrollPane?

그리드의 레이아웃에 이미지 썸네일을 추가하는 방법은 무엇입니까?

이 질문은 JScrollPane 내에 일련의 이미지 썸네일을 보유하기 위해 SpringLayout 그리드를 살펴봅니다. 특히, 사진 목록의 크기가 클 수 있는 경우 레이아웃을 처리하는 방법에 대해 설명합니다.

따라서 기본적으로 스크롤 창(일반적으로 뷰라고 함)에 있는 일종의 컨테이너가 필요합니다. 여기에 이미지를 추가해야 합니다.

다음 Java 코드 예제에서 사진은 JPanel에 있으며 JScrollPane에 있습니다.

import java.awt.BorderLayout;
java.awt.Component 가져오기;
java.awt.Container 가져오기;
가져오기 java.awt.Dimension;
가져오기 java.awt.EventQueue;
가져오기 java.awt.FlowLayout;
가져오기 java.awt.Graphics;
가져오기 java.awt.Graphics2D;
가져오기 java.awt.Image;
가져오기 java.awt.Insets;
가져오기 java.awt.event.ActionEvent;
가져오기 java.awt.event.ActionListener;
가져오기 java.awt.geom.AffineTransform;
가져오기 java.awt.image.BufferedImage;
가져오기 java. io.File;
가져오기 java.io.FileFilter;
가져오기 java.io.IOException;
가져오기 javax.imageio.ImageIO;
가져오기 javax.swing.JButton;
가져오기 javax.swing.JFrame;
가져오기 javax.swing.JPanel;
가져오기 javax.swing.JScrollPane;
가져오기 javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ImageGrid {

public static void main(String[] args) {
    new ImageGrid();
}

public ImageGrid() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            }

            JFrame frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(new TestPane());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    });
}

public class TestPane extends JPanel {

    private JPanel imagesPane;

    public TestPane() {
        setLayout(new BorderLayout());
        imagesPane = new JPanel(new WrapLayout());
        add(new JScrollPane(imagesPane));
        JButton scan = new JButton("Scan");
        scan.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String path = "C:\Users\shane\Dropbox\Ponies";
                File[] files = new File(path).listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        String name = pathname.getName().toLowerCase();
                        return pathname.isFile() && (name.endsWith(".png")
                                || name.endsWith(".jpg")
                                || name.endsWith(".gif"));
                    }
                });
                imagesPane.removeAll();
                for (File file : files) {
                    try {
                        ImagePane pane = new ImagePane(file);
                        imagesPane.add(pane);
                    } catch (Exception exp) {
                        exp.printStackTrace();
                    }
                }
                imagesPane.revalidate();
                imagesPane.repaint();
            }
        });
        add(scan, BorderLayout.SOUTH);
    }
}

public class ImagePane extends JPanel {

    private Image img;

    public ImagePane(File source) throws IOException {
        img = ImageIO.read(source);
        if (img.getWidth(this) > 200 || img.getHeight(this) > 200) {
            int width = img.getWidth(this);
            int height = img.getWidth(this);
            float scaleWidth = 200f / width;
            float scaleHeight = 200f / height;
            if (scaleWidth > scaleHeight) {
                width = -1;
                height = (int)(height * scaleHeight);
            } else {
                width = (int)(width * scaleWidth);
                height = -1;
            }
            img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        if (img != null) {

// int width = img.getWidth();
// int 높이 = img.getHeight();
// float scale = 1f;
// AffineTransform at = new AffineTransform();
// at.translate(
// (getWidth() / 2) - ((img.getWidth() * scale) / 2),
// (getHeight() / 2) - ((img.getHeight() * scale) / 2));
// at.scale(scale, scale);
// g2d.setTransform(at);

            g2d.drawImage(img, 0, 0, this);
        }
        g2d.dispose();
    }
}

/**
 * FlowLayout subclass that fully supports wrapping of components.
 */
public class WrapLayout extends FlowLayout {

    private Dimension preferredLayoutSize;

    /**
     * Constructs a new
     * <code>WrapLayout</code> with a left alignment and a default 5-unit
     * horizontal and vertical gap.
     */
    public WrapLayout() {
        super();
    }

    /**
     * Constructs a new
     * <code>FlowLayout</code> with the specified alignment and a default 5-unit
     * horizontal and vertical gap. The value of the alignment argument must be
     * one of
     * <code>WrapLayout</code>,
     * <code>WrapLayout</code>, or
     * <code>WrapLayout</code>.
     *
     * @param align the alignment value
     */
    public WrapLayout(int align) {
        super(align);
    }

    /**
     * Creates a new flow layout manager with the indicated alignment and the
     * indicated horizontal and vertical gaps.
     * <p>
     * The value of the alignment argument must be one of
     * <code>WrapLayout</code>,
     * <code>WrapLayout</code>, or
     * <code>WrapLayout</code>.
     *
     * @param align the alignment value
     * @param hgap the horizontal gap between components
     * @param vgap the vertical gap between components
     */
    public WrapLayout(int align, int hgap, int vgap) {
        super(align, hgap, vgap);
    }

    /**
     * Returns the preferred dimensions for this layout given the
     * <i>visible</i> components in the specified target container.
     *
     * @param target the component which needs to be laid out
     * @return the preferred dimensions to lay out the subcomponents of the
     * specified container
     */
    @Override
    public Dimension preferredLayoutSize(Container target) {
        return layoutSize(target, true);
    }

    /**
     * Returns the minimum dimensions needed to layout the <i>visible</i>
     * components contained in the specified target container.
     *
     * @param target the component which needs to be laid out
     * @return the minimum dimensions to lay out the subcomponents of the
     * specified container
     */
    @Override
    public Dimension minimumLayoutSize(Container target) {
        Dimension minimum = layoutSize(target, false);
        minimum.width -= (getHgap() + 1);
        return minimum;
    }

    /**
     * Returns the minimum or preferred dimension needed to layout the target
     * container.
     *
     * @param target target to get layout size for
     * @param preferred should preferred size be calculated
     * @return the dimension to layout the target container
     */
    private Dimension layoutSize(Container target, boolean preferred) {
        synchronized (target.getTreeLock()) {
            //  Each row must fit with the width allocated to the containter.
            //  When the container width = 0, the preferred width of the container
            //  has not yet been calculated so lets ask for the maximum.

            int targetWidth = target.getSize().

위 내용은 JScrollPane 내의 Java 그리드 레이아웃에 많은 수의 이미지 축소판을 효율적으로 표시하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.