If you really don't want an unpleasant headache, I would suggest using a layout management system.
Instead of setting the size and location of the components, let them decide how they can be displayed where possible.
Although I personally use the Netbeans form designer, I would advise you to take the time to learn how to create your user interface manually, this will give more information about what form designers can do, as well as ideas that you can work with for creating advanced user interfaces - IMHO

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.LineBorder; public class SimpleImageBrowser { public static void main(String[] args) { new SimpleImageBrowser(); } public SimpleImageBrowser() { 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 SimpleImageBrowser.ImageBrowserPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class ImageBrowserPane extends JPanel { private JFileChooser fcImage = new JFileChooser(); private SimpleImageBrowser.ImagePane imagePane; public ImageBrowserPane() { setLayout(new BorderLayout()); imagePane = new SimpleImageBrowser.ImagePane(); add(new JScrollPane(imagePane)); JButton add = new JButton("Add"); add.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int state = fcImage.showOpenDialog(SimpleImageBrowser.ImageBrowserPane.this); switch (state) { case JFileChooser.APPROVE_OPTION: File file = fcImage.getSelectedFile(); try { BufferedImage bi1 = ImageIO.read(file); ImageIcon icon1 = new ImageIcon(bi1); JLabel label = new JLabel(icon1); label.setText(file.getPath()); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); label.setForeground(Color.WHITE); label.setBorder(new LineBorder(Color.WHITE)); imagePane.add(label); imagePane.revalidate(); } catch (Exception exp) { exp.printStackTrace(); } } } }); JPanel buttons = new JPanel(); buttons.add(add); add(buttons, BorderLayout.NORTH); } } public class ImagePane extends JPanel { public ImagePane() { setLayout(new SimpleImageBrowser.WrapLayout()); setBackground(Color.BLACK); } @Override public Dimension getPreferredSize() { return getComponentCount() == 0 ? new Dimension(200, 200) : super.getPreferredSize(); } } 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()) {
I turned WrapLayout Rob Kamik's WrapLayout (which is hiding about the place) because, to be honest, none of the other layout managers gave me the effect I wanted.
I also set the label text using the image path
Take a look at Using Layout Managers and the Visual Guide to Layout Managers
Take a look at WrapLayout
Updated with text fields
If you want to associate a text field with an image, I suggest you add both a label and a text field to JPanel (using something like BorderLayout ), and then add this to your image panel ..

public class ImagePane extends JPanel { public ImagePane() { setLayout(new SimpleImageBrowser.WrapLayout()); setBackground(Color.BLACK); } public void addImage(File file) throws IOException { BufferedImage bi1 = ImageIO.read(file); ImageIcon icon1 = new ImageIcon(bi1); JPanel imgPane = new JPanel(new BorderLayout()); imgPane.setOpaque(false); JLabel label = new JLabel(icon1); imgPane.add(label); JTextField field = new JTextField(file.getPath(), 20); field.setEditable(false); imgPane.add(field, BorderLayout.SOUTH); add(imgPane); revalidate(); } @Override public Dimension getPreferredSize() { return getComponentCount() == 0 ? new Dimension(200, 200) : super.getPreferredSize(); } }
And the updated ActionListener ...
add.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int state = fcImage.showOpenDialog(SimpleImageBrowser.ImageBrowserPane.this); switch (state) { case JFileChooser.APPROVE_OPTION: File file = fcImage.getSelectedFile(); try { imagePane.addImage(file); } catch (IOException ex) { ex.printStackTrace(); } } } });