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

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().</p>

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

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
JVM의 클래스 로더 서브 시스템은 플랫폼 독립성에 어떻게 기여합니까?JVM의 클래스 로더 서브 시스템은 플랫폼 독립성에 어떻게 기여합니까?Apr 23, 2025 am 12:14 AM

클래스 로더는 통합 클래스 파일 형식, 동적로드, 부모 위임 모델 및 플랫폼 독립적 인 바이트 코드를 통해 다른 플랫폼에서 Java 프로그램의 일관성과 호환성을 보장하고 플랫폼 독립성을 달성합니다.

Java 컴파일러는 플랫폼 별 코드를 생성합니까? 설명하다.Java 컴파일러는 플랫폼 별 코드를 생성합니까? 설명하다.Apr 23, 2025 am 12:09 AM

Java 컴파일러가 생성 한 코드는 플랫폼 독립적이지만 궁극적으로 실행되는 코드는 플랫폼 별입니다. 1. Java 소스 코드는 플랫폼 독립적 인 바이트 코드로 컴파일됩니다. 2. JVM은 바이트 코드를 특정 플랫폼의 기계 코드로 변환하여 크로스 플랫폼 작동을 보장하지만 성능이 다를 수 있습니다.

JVM은 다른 운영 체제에서 멀티 스레딩을 어떻게 처리합니까?JVM은 다른 운영 체제에서 멀티 스레딩을 어떻게 처리합니까?Apr 23, 2025 am 12:07 AM

멀티 스레딩은 프로그램 대응 성과 리소스 활용을 향상시키고 복잡한 동시 작업을 처리 할 수 ​​있기 때문에 현대 프로그래밍에서 중요합니다. JVM은 스레드 매핑, 스케줄링 메커니즘 및 동기화 잠금 메커니즘을 통해 다양한 운영 체제에서 멀티 스레드의 일관성과 효율성을 보장합니다.

'플랫폼 독립성'은 Java의 맥락에서 무엇을 의미합니까?'플랫폼 독립성'은 Java의 맥락에서 무엇을 의미합니까?Apr 23, 2025 am 12:05 AM

Java의 플랫폼 독립성은 작성된 코드가 수정없이 JVM이 설치된 모든 플랫폼에서 실행될 수 있음을 의미합니다. 1) Java 소스 코드는 바이트 코드로 컴파일됩니다. 2) 바이트 코드는 JVM에 의해 해석되고 실행됩니다.

Java 응용 프로그램이 여전히 플랫폼 별 버그 또는 문제를 만날 수 있습니까?Java 응용 프로그램이 여전히 플랫폼 별 버그 또는 문제를 만날 수 있습니까?Apr 23, 2025 am 12:03 AM

javaapplicationscanindeedencounterplatform-specificissuesdespitetejvm'sabstraction.ressistinclude : 1) nativecodeandlibraries, 2) OperatingSystemDifferences, 3) jvmimplementationvariations, 및 4) 어려운 의존성, 개발자, 1)

클라우드 컴퓨팅은 Java의 플랫폼 독립성의 중요성에 어떤 영향을 미칩니 까?클라우드 컴퓨팅은 Java의 플랫폼 독립성의 중요성에 어떤 영향을 미칩니 까?Apr 22, 2025 pm 07:05 PM

클라우드 컴퓨팅은 Java의 플랫폼 독립성을 크게 향상시킵니다. 1) Java Code는 바이트 코드로 컴파일되어 다른 운영 체제에서 JVM에 의해 실행되어 크로스 플랫폼 작동을 보장합니다. 2) Docker 및 Kubernetes를 사용하여 Java 응용 프로그램을 배포하여 휴대 성 및 확장 성을 향상시킵니다.

Java의 플랫폼 Independence는 광범위한 채택에서 어떤 역할을 했습니까?Java의 플랫폼 Independence는 광범위한 채택에서 어떤 역할을 했습니까?Apr 22, 2025 pm 06:53 PM

Java'SplatformIndencealLowsDeveloperstowStowRiteCodeOntOnitOniNanyDeviceOroswithajvm. ThisIsachieAdthroughCompilingTobyTecode, thejvMIngretSorcompileStruntime.thistureatureDificallyNatlyBoostedjava'SADOPTIONDUOCROSS-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PPLATION

Docker와 같은 컨테이너화 기술 (Docker)은 Java의 플랫폼 독립성의 중요성에 어떤 영향을 미칩니 까?Docker와 같은 컨테이너화 기술 (Docker)은 Java의 플랫폼 독립성의 중요성에 어떤 영향을 미칩니 까?Apr 22, 2025 pm 06:49 PM

Docker와 같은 컨테이너화 기술은 Java의 플랫폼 독립성을 대체하기보다는 향상됩니다. 1) 환경 간 일관성을 보장, 2) 특정 JVM 버전을 포함한 종속성 관리, 3) 배포 프로세스를 단순화하여 Java 응용 프로그램을보다 적응 가능하고 관리 할 수 ​​있도록합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)