简体   繁体   中英

How do I dynamically resize the JFrame to include JPanel with varying content size?

How do I make my JFrame match the size of the JPanel which holds the dynamically sized content?

I have created two simple class snippets if anyone could guide me through them.

Class1 : CanvasExample.java

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class CanvasExample {
    public static void main(String[] args) {
        JPanelEx dataOut = new JPanelEx();
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new JFrame("Title!");
                f.setMinimumSize(new Dimension(200,100));
                f.getContentPane().add(dataOut);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

Class 2: JPanelEx.java

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JPanelEx extends JPanel {
   public JPanelEx() {
         super(new FlowLayout());
   }
   public void paintComponent(Graphics g) {
        super.paintComponent(g); 
        g.drawString("Hello1", 10, 10);
        g.drawString("Hello2", 10, 30);
        g.drawString("Hello3", 10, 50);
        g.drawString("Hello4", 10, 70);
        g.drawString("Hello5", 10, 90);
        g.drawString("Hello6", 10, 110);
        g.drawString("Hello7", 10, 130);
        g.drawString("Hello8", 10, 150);
        g.drawString("Hello9", 10, 170);
        g.drawString("Hello10", 10, 190);
        g.dispose();
  }
}

Current Output :

电流输出

Expected Output :

预期产量

I understand similar question might have been asked many times but I scanned through and couldn't get a clear solution. Any help is appreciated.

Your JPanelEx will need to provide size hints to allow the layout management system to determine how best the component should be laid out and the amount of space the content needs

Also, don't call dispose on Graphics contexts you didn't create!

As an example...

在此处输入图片说明

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JPanelEx());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class JPanelEx extends JPanel {

        private int numElements = 10;

        public JPanelEx() {
            super(new FlowLayout());
        }

        @Override
        public Dimension getPreferredSize() {

            FontMetrics fm = getFontMetrics(getFont());
            int width = 0;
            int height = fm.getHeight() * numElements;
            for (int index = 0; index < numElements; index++) {
                width = Math.max(width, fm.stringWidth("Hello" + index));
            }

            return new Dimension(width, height);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int x = 0;
            int y = 0;
            FontMetrics fm = g.getFontMetrics();
            for (int index = 0; index < numElements; index++) {
                g.drawString("Hello" + index, x, y + fm.getAscent());
                y += fm.getHeight();
            }
        }
    }

}

Also see Laying Out Components Within a Container for more details about the layout manager API

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM