import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import 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(
"Image Grid"
);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(
new
BorderLayout());
JPanel photoPanel =
new
JPanel(
new
WrapLayout());
JScrollPane photoScroll =
new
JScrollPane(photoPanel);
frame.add(photoScroll, BorderLayout.CENTER);
JButton scanButton =
new
JButton(
"Scan"
);
scanButton.addActionListener(
new
ActionListener() {
@Override
public
void actionPerformed(ActionEvent e) {
String path =
"Enter path to your image directory"
;
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"
));
}
});
photoPanel.removeAll();
for
(File file : files) {
try
{
ImagePane pane =
new
ImagePane(file);
photoPanel.add(pane);
}
catch
(Exception
exp
) {
exp
.printStackTrace();
}
}
photoPanel.revalidate();
photoPanel.repaint();
}
});
frame.add(scanButton, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setResizable(true);
frame.setVisible(true);
}
});
}
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 x = (getWidth() - img.getWidth(this)) / 2;
int y = (getHeight() - img.getHeight(this)) / 2;
g2d.drawImage(img, x, y, this);
}
g2d.dispose();
}
}
public
class
WrapLayout
extends
FlowLayout {
private
Dimension preferredLayoutSize;
public
WrapLayout() {
super();
}
public
WrapLayout(int align) {
super(align);
}
public
WrapLayout(int align, int hgap, int vgap) {
super(align, hgap, vgap);
}
@Override
public
Dimension preferredLayoutSize(Container target) {
return
layoutSize(target, true);
}
@Override
public
Dimension minimumLayoutSize(Container target) {
Dimension minimum = layoutSize(target, false);
minimum.width -= (getHgap() + 1);
return
minimum;
}
private
Dimension layoutSize(Container target, boolean preferred) {
synchronized (target.getTreeLock()) {