Java布局怎么加图片组件_java – 将图像缩略图添加到网格中的布局...

该博客展示了如何在Java中创建一个布局,将图片缩略图添加到网格中。通过使用自定义的WrapLayout布局管理和ImagePane组件,可以实现图片的自动换行和缩放。用户可以通过按钮扫描指定文件夹下的.png, .jpg和.gif文件并显示为200x200像素的缩略图。" 88387025,7538545,奇异值分解SVD:降维与推荐系统的秘密,"['机器学习', '奇异值分解', '推荐系统', '数学', '数据处理']
摘要由CSDN通过智能技术生成

所以基本上,你需要一些存在于滚动窗格中的容器(通常称为视图).

为此你应该添加你的图像.

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

* WrapLayout with a left alignment and a default 5-unit

* horizontal and vertical gap.

*/

public WrapLayout() {

super();

}

/**

* Constructs a new

* FlowLayout with the specified alignment and a default 5-unit

* horizontal and vertical gap. The value of the alignment argument must be

* one of

* WrapLayout,

* WrapLayout, or

* WrapLayout.

*

* @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.

*

* The value of the alignment argument must be one of

* WrapLayout,

* WrapLayout, or

* WrapLayout.

*

* @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

* visible 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 visible

* 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,但这是这个想法的一个例子.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值