在单个JPanel中添加多个图像

我有一个JPanel我想在该面板中添加多个图像,还提供垂直滚动来显示图像。 图像可能具有不同的大小。

我怎样才能做到这一点?

对于尺寸不等的图像,请在JList使用文本和/或“小图标”渲染器,并将其放在BorderLayoutPAGE_START中。 添加一个监听器,然后在CENTERJScrollPane中的JLabel中显示所选图像。 像这样的东西:

的ImageList

 import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.filechooser.FileNameExtensionFilter; import javax.imageio.ImageIO; public class ImageList { private JPanel gui; private JFileChooser fileChooser; FilenameFilter fileNameFilter; private JMenuBar menuBar; DefaultListModel model; ImageList() { gui = new JPanel(new GridLayout()); JPanel imageViewContainer = new JPanel(new GridBagLayout()); final JLabel imageView = new JLabel(); imageViewContainer.add(imageView); model = new DefaultListModel(); final JList imageList = new JList(model); imageList.setCellRenderer(new IconCellRenderer()); ListSelectionListener listener = new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent lse) { Object o = imageList.getSelectedValue(); if (o instanceof BufferedImage) { imageView.setIcon(new ImageIcon((BufferedImage)o)); } } }; imageList.addListSelectionListener(listener); fileChooser = new JFileChooser(); String[] imageTypes = ImageIO.getReaderFileSuffixes(); FileNameExtensionFilter fnf = new FileNameExtensionFilter("Images", imageTypes); fileChooser.setFileFilter(fnf); File userHome = new File(System.getProperty("user.home")); fileChooser.setSelectedFile(userHome); fileNameFilter = new FilenameFilter() { @Override public boolean accept(File file, String name) { return true; } }; menuBar = new JMenuBar(); JMenu menu = new JMenu("File"); menuBar.add(menu); JMenuItem browse = new JMenuItem("Browse"); menu.add(browse); browse.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae) { int result = fileChooser.showOpenDialog(gui); if (result==JFileChooser.APPROVE_OPTION) { File eg = fileChooser.getSelectedFile(); // this will be an image, we want the parent directory File dir = eg.getParentFile(); try { loadImages(dir); } catch(Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog( gui, e, "Load failure!", JOptionPane.ERROR_MESSAGE); } } } }); gui.add(new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, new JScrollPane( imageList, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), new JScrollPane(imageViewContainer))); } public void loadImages(File directory) throws IOException { File[] imageFiles = directory.listFiles(fileNameFilter); BufferedImage[] images = new BufferedImage[imageFiles.length]; model.removeAllElements(); for (int ii=0; ii 

如果图像大小相同,请参阅此答案 。 (在规范澄清之前,这是答案的最高点。我离开了它,因为它是如此可爱的屏幕截图。)

结合评论以对此问题做出有用的回答:

JPanel添加JLabel等多个组件,并将Images设置为图标,将整个面板添加到JScrollPane 。 组件的层次结构如下:

JFrame / JWindow – > JScrollPane – > JPanel – > JLabel(s)

其中– >代表’ 包含 ‘。