I create a class, ImageGroup , which will display a group of photos on the screen.
Photo sizes may vary. ImageGroup inherits the JPanel class and installs the GridBagLayout layout manager.
My problem is that the location manager ignores block sizes and the cells become narrow in height.
Below, I presented a drawing of what the cells should look like.
class ImageGroup
public class ImageGroup extends JPanel{ private List<ImagePanel> imageList; // private GridBagConstraints constraints; public ImageGroup(List<ImagePanel> imageList) { this.imageList = imageList; this.setSize(new Dimension(240, 200)); this.setLayout(new GridBagLayout()); } public void arrangeElements() { int previosPhotoSpacing = 0; int panelSize = 240; int x = 0, y = 0; GridBagConstraints constraints = new GridBagConstraints(); constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.weightx = 1.0; constraints.weighty = 1.0; constraints.insets = new Insets(5, 5, 5, 5); for(ImagePanel entry : imageList) { Dimension d = entry.getSize(); int photoSize = (int) d.getWidth(); if(previosPhotoSpacing <= 0) { previosPhotoSpacing = panelSize - photoSize; constraints.gridy = y++; constraints.gridx = x; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.gridwidth = GridBagConstraints.REMAINDER; } else { constraints.gridx = x++; constraints.gridy = y; constraints.fill = GridBagConstraints.BOTH; constraints.gridwidth = GridBagConstraints.RELATIVE; } this.add(entry, constraints); } //Чтобы заполнить всё оставшиеся пространство constraints.gridy = 9999; constraints.weighty = 9999f; constraints.ipadx = 0; constraints.ipady = 0; constraints.insets = new Insets( 0, 0, 0, 0 ); constraints.fill = GridBagConstraints.NONE; this.add( Box.createVerticalStrut( 0 ), constraints ); } } Adding photos:
File[] files = fileopen.getSelectedFiles(); List<ImagePanel> ipList = new ArrayList<>(); ImagePanel ip1 = new ImagePanel(); ip1.setBackground(ImageIO.read(files[0])); ip1.setSize(new Dimension(224, 160)); ip1.setMaximumSize(new Dimension(224, 160)); ImagePanel ip2 = new ImagePanel(); ip2.setBackground(ImageIO.read(files[1])); ip2.setSize(new Dimension(110, 80)); ip2.setMaximumSize(new Dimension(110, 80)); ImagePanel ip3 = new ImagePanel(); ip3.setBackground(ImageIO.read(files[2])); ip3.setSize(new Dimension(110, 80)); ip3.setMaximumSize(new Dimension(110, 80)); ipList.add(ip1); ipList.add(ip2); ipList.add(ip3); GroupImage gi = new GroupImage(ipList); gi.arrangeElements(); jPanel11.add(gi); ImagePanel class
public class ImagePanel extends JPanel { private BufferedImage img; private BufferedImage scaled; public ImagePanel() { } @Override public Dimension getPreferredSize() { return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight()); } public void setBackground(BufferedImage value) { if (value != img) { this.img = value; repaint(); } } @Override public void invalidate() { super.invalidate(); if (getWidth() > img.getWidth() || getHeight() > img.getHeight()) { scaled = getScaledInstanceToFill(img, getSize()); } else { scaled = img; } } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (scaled != null) { int x = (getWidth() - scaled.getWidth()) / 2; int y = (getHeight() - scaled.getHeight()) / 2; g.drawImage(scaled, x, y, this); } } public static BufferedImage getScaledInstanceToFill(BufferedImage img, Dimension size) { double scaleFactor = getScaleFactorToFill(img, size); return getScaledInstance(img, scaleFactor); } } 
constraints.ipadx = (int) d.getWidth(); constraints.ipady = (int) d.getHeight();constraints.ipadx = (int) d.getWidth(); constraints.ipady = (int) d.getHeight();The result was what was needed. Is the solution right? - murash