gpt4 book ai didi

java - 将图像缩略图添加到网格布局中?

转载 作者:行者123 更新时间:2023-12-03 02:00:05 25 4
gpt4 key购买 nike

我有一个图像列表。我需要将小缩略图添加到框架中。我目前有带有 SpringLayout 的框架。如何使用滚动 Pane 在某些网格中添加缩略图(如时尚)。照片列表可能很大,所以我需要一个滚动 Pane 。我不知道如何用 SpringLayout 处理这个问题。我知道如何添加缩略图;真正的问题是如何在 SpringLayout 中显示缩略图网格。

import java.awt.Color;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SpringLayout;

public class grid {

/**
* @param args
*/
public grid() {

JFrame frame = new JFrame("Hello");
Container pane = frame.getContentPane();

pane.setBackground(Color.WHITE);
SpringLayout layout = new SpringLayout();
pane.setLayout(layout);

JPanel photoPanel = new JPanel();
JScrollPane photoScroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
photoPanel.add(photoScroll);
pane.add(photoPanel);

layout.putConstraint(SpringLayout.WEST, photoPanel, 260, SpringLayout.WEST, pane);
layout.putConstraint(SpringLayout.NORTH, photoPanel, 40, SpringLayout.SOUTH, pane);

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

frame.pack();
//frame.setSize(frame.getMaximumSize());
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setLocationRelativeTo(null);
frame.setResizable(true);
frame.setVisible(true);
}

public static void main(String[] args) {
// TODO Auto-generated method stub

new grid();
}
}

最佳答案

所以基本上,您需要某种位于滚动 Pane 中的容器(通常称为 View )。

为此,您应该添加您的图像。

enter image description here

import java.awt.BorderLayout;
import java.awt.Component;
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("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 height = 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().width;

if (targetWidth == 0) {
targetWidth = Integer.MAX_VALUE;
}

int hgap = getHgap();
int vgap = getVgap();
Insets insets = target.getInsets();
int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2);
int maxWidth = targetWidth - horizontalInsetsAndGap;

// Fit components into the allowed width

Dimension dim = new Dimension(0, 0);
int rowWidth = 0;
int rowHeight = 0;

int nmembers = target.getComponentCount();

for (int i = 0; i < nmembers; i++) {
Component m = target.getComponent(i);

if (m.isVisible()) {
Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize();

// Can't add the component to current row. Start a new row.

if (rowWidth + d.width > maxWidth) {
addRow(dim, rowWidth, rowHeight);
rowWidth = 0;
rowHeight = 0;
}

// Add a horizontal gap for all components after the first

if (rowWidth != 0) {
rowWidth += hgap;
}

rowWidth += d.width;
rowHeight = Math.max(rowHeight, d.height);
}
}

addRow(dim, rowWidth, rowHeight);

dim.width += horizontalInsetsAndGap;
dim.height += insets.top + insets.bottom + vgap * 2;

// When using a scroll pane or the DecoratedLookAndFeel we need to
// make sure the preferred size is less than the size of the
// target containter so shrinking the container size works
// correctly. Removing the horizontal gap is an easy way to do this.

Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target);

if (scrollPane != null && target.isValid()) {
dim.width -= (hgap + 1);
}

return dim;
}
}

/*
* A new row has been completed. Use the dimensions of this row
* to update the preferred size for the container.
*
* @param dim update the width and height when appropriate
* @param rowWidth the width of the row to add
* @param rowHeight the height of the row to add
*/
private void addRow(Dimension dim, int rowWidth, int rowHeight) {
dim.width = Math.max(dim.width, rowWidth);

if (dim.height > 0) {
dim.height += getVgap();
}

dim.height += rowHeight;
}
}
}

此示例包括WrapLayout 。进行缩放是为了速度和简单,但是使用的方法是不可见的,看看this寻求更好的方法。

我通常会在后台线程中加载和缩放图像,例如 SwingWorker,但这是这个想法的一个示例。

关于java - 将图像缩略图添加到网格布局中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15961412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com