그리드의 레이아웃에 이미지 썸네일을 추가하는 방법은 무엇입니까?
이 질문은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!