title: Resize components on frame resize Java
body: <p>I'm having some trouble trying to resize the components in my GUI when I resize the GUI. Right now, when I resize the GUI, the size of the components don't change, they keep to the static size I set them to. When I resize the GUI passed the minimum size needed to display them, they are no longer displayed. I want them to resize and maintain an aspect ratio when the GUI is resized.</p>
  
  <p>Here's the code I have for the GUI:</p>
  
  <pre><code>import java.applet.*;
  import java.awt.*;
  import java.awt.event.*;
  import java.awt.image.BufferedImage;
  import java.awt.image.ImageObserver;
  import java.io.*;
  import java.net.*;
  
  import javax.imageio.ImageIO;
  import javax.swing.*;
  import javax.swing.border.Border;
  import javax.swing.text.*;
  import javax.swing.text.html.*;
  
  public class DraftGUI implements MouseListener {
  
  private JPanel jpPack;
  private JPanel jpCards;
  private JPanel jpInfo;
  private JPanel jpChat;
  private TextField tf;
  private StyledDocument doc;
  private JTextPane tp;
  private JScrollPane sp;
  
  public void mousePressed(MouseEvent e) {
  }
  
  public void mouseReleased(MouseEvent e) {
  }
  
  public void mouseEntered(MouseEvent e) {
      }
  
      public void mouseExited(MouseEvent e) {
      }
  
  public void mouseClicked(MouseEvent e) {
      e.getComponent().setVisible(false);
  }
  
  private Client client;
  
  
  public GUI(Client client) throws IOException {
  
      JFrame frame = new JFrame("Draft");
  
      //set the size to fullscreen to start
      frame.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
  
      //set the content pane, we'll add everything to it and then add it to the frame
      JPanel contentPane = new JPanel();
      contentPane.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
      contentPane.setLayout(new GridBagLayout());
  
      //creates some panels with some default values for now
      JPanel jpCards = new JPanel(new BorderLayout());
      jpCards.setOpaque(true); //ensures it paints every pixel
      jpCards.setBackground(Color.BLUE);
  
      JPanel jpInfo = new JPanel();
      jpInfo.setOpaque(true);
      jpInfo.setBackground(Color.GREEN);
  
      JPanel jpPack = new JPanel(new GridBagLayout());
      jpPack.setOpaque(true);
      jpPack.setBackground(Color.RED);
  
      //grab some info to make the JTextPane and make it scroll
      this.client = client;
      tf = new TextField();
      doc = new DefaultStyledDocument();
      tp = new JTextPane(doc);
      tp.setEditable(false);
      tf.addActionListener(this.client);
      sp = new JScrollPane(tp);
  
      //adding the quantities to the chat panel
      JPanel jpChat = new JPanel();
      jpChat.setLayout(new BorderLayout());
      jpChat.add("North", tf);
      jpChat.add("Center", sp);
  
      //a new GridBagConstraints used to set the properties/location of the panels
      GridBagConstraints c = new GridBagConstraints(); 
  
      //adding some panels to the content pane
      //set it to start from the top left of the quadrant if it's too small
      c.anchor = GridBagConstraints.FIRST_LINE_START; 
      c.fill = GridBagConstraints.BOTH; //set it to fill both vertically and horizontally
      c.gridx = 0; //set it to quadrant x=0 and
      c.gridy = 0; //set it to quadrant y=0
      c.weightx = 0.7;
      c.weighty = 0.3;
      contentPane.add(jpCards, c);
  
      c.gridx = 1;
      c.gridy = 0;
      c.weightx = 0.3;
      c.weighty = 0.3;
      contentPane.add(jpInfo, c);
  
      c.gridx = 0;
      c.gridy = 1;
      c.weightx = 0.7;
      c.weighty = 0.7;
      contentPane.add(jpPack, c);
  
      c.gridx = 1;
      c.gridy = 1;
      c.weightx = 0.3;
      c.weighty = 0.7;
      contentPane.add(jpChat, c);
  
      //set some necessary values 
      frame.setContentPane(contentPane);
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
  
      //This code works for adding an Image
      //need to learn how to specify a path not dependent on the specific users's machine
      //this is not a high priority for now though
      GridBagConstraints d = new GridBagConstraints();
      d.gridx = 0;
      d.gridy = 0;
  
      ImageLabel imageLabel1 = new ImageLabel("path-to-file");
  
      imageLabel1.setPreferredSize(new Dimension(223, 310));
      jpPack.add(imageLabel1, d);
  
      ImageLabel imageLabel2 = new ImageLabel("path-to-file");
      imageLabel2.setPreferredSize(new Dimension(223, 310));
      ImageLabel imageLabel3 = new ImageLabel("path-to-file");
      imageLabel3.setPreferredSize(new Dimension(223, 310));
      d.gridx = 1;
      jpPack.add(imageLabel2, d);
      d.gridy = 1;
      jpPack.add(imageLabel3, d);
  
      imageLabel1.addMouseListener(this);
      imageLabel2.addMouseListener(this);
      imageLabel3.addMouseListener(this);
  
      //223, 310 are the aspect values for a card image, width, height
      //these need to be maintained as the GUI size changes
  
      }
  
  }
  
  
  class ImageLabel extends JLabel {
     Image image;
     ImageObserver imageObserver; 
  
     // constructor with filename     
     ImageLabel(String filename) {
        ImageIcon icon = new ImageIcon(filename);
        image = icon.getImage();
        imageObserver = icon.getImageObserver();
     }
  
     // constructor with icon
     ImageLabel(ImageIcon icon) {
        image = icon.getImage();
        imageObserver = icon.getImageObserver();
     }
  
     // overload setIcon method
     void setIcon(ImageIcon icon) {
        image = icon.getImage();
        imageObserver = icon.getImageObserver();
     }
  
     // overload paint()
     public void paint( Graphics g ) {
         super.paint( g );
         g.drawImage(image,  0 , 0 , getWidth() , getHeight() , imageObserver);
  
     }
  
  }
  </code></pre>
  
  <p>For some reason, there's no default resizing property for the frame's components, so when the frame resizes, the components don't do anything. I'm not sure what I'm doing wrong or missed, but clearly I left something out.</p>
  
  <p>Also, if anyone knows, the ImageLabels are taking up extra space around them. The padding is set to 0 by default, so I'm not sure why it's creating like a border around them.</p>
  
  <p>Thanks.</p>
  
  <p>EDIT for Guillaume:</p>
  
  <p>I know a main is necessary if I want to run it as a standalone, it's currently part of another application and gets called separately from within it. It was probably not the best decision to post it without a main for completeness, but whatever, it can't be that big of a problem.</p>
  
  <p>Your code took out the portion where the picture was actually displayed. "path-to-file" was supposed to be replaced by an actual image file path, so you would display the image. It's hard to actually see the issue at hand when it's simply text in there.</p>
  
  <p>When you have the image displayed correctly, and you try to resize the entire GUI, you will notice that the image doesn't shrink. It keeps to its preferred size and has issues when it becomes smaller than it. In my code, it stops displaying the picture completely when it can't display at least the preferred size. In your code, it cuts off part of the picture when it shrinks. </p>
  
  <p>What I want is for it to actually resize the JLabel containing the picture, so that as the GUI resizes, so will the image. It's necessary that the image shrinks accordingly for my program. The user will eventually have functionality based on clicking the images, so displaying only some images or portions of them simply won't do.</p>
  
  <p>Please try your code/my code again and reproduce the issue I'm having, testing with pictures, so that we can find a correct solution. Thanks.</p>