1

I am trying to make a JScrollPane that contains JPanels that have charts from the JFreeChart API. GenerateChartPanel is a method that return the charts in a JPanel so I can quickly make a bunch of them. So far I have this in main:

 public static void main (String[] args){ 
    JFrame main = new JFrame();
    main.setLayout(new BorderLayout());
    main.setPreferredSize(new Dimension(500,500));

    //Creates specFrame
    JScrollPane specScrollPane = new JScrollPane();
    JPanel container = new JPanel();
    container.setLayout(new GridLayout());

    container.add(generateSpecPanelFromSmiles("C"));
    container.add(generateSpecPanelFromSmiles("CC"));
    container.add(generateSpecPanelFromSmiles("CCC"));

    container.setVisible(true);
    specScrollPane.setVisible(true);
    specScrollPane.add(container);
    main.add(specScrollPane);

    RefineryUtilities.centerFrameOnScreen(main);
    main.setVisible(true);

When I run this, nothing shows up. Apparently you can't pack, setCloseOp, setLayout, or center these panes so I commented them out. What am I missing?

EDIT: Getting Dimensions

 specPanel.addComponentListener(new java.awt.event.ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent event) {
            specPanel.setSize(Math.min(specPanel.getPreferredSize().width, specPanel.getWidth()),
                    Math.min(specPanel.getPreferredSize().height, specPanel.getHeight()));
        }
    });

thanks

bforcer
  • 125
  • 1
  • 11

1 Answers1

4

EDIT

whatever the generateSpecPanelFromSmiles is it, to must returns PreferredSize to parentPanel, e.g. (playing with PreferredSize with GridLayout and BoxLayout - box accepting min, max and preferred size)

.

enter image description here

.

enter image description here

.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class JPanelsInsideJScrollPane {

    private JFrame frame = new JFrame("JPanels Inside JScrollPane");
    private JScrollPane scrollPane = new JScrollPane();
    private JPanel parentPanel, childOne, childTwo, childThree;
    private JButton button = new JButton("Change, Switch Layout Manager to BoxLayout");

    public JPanelsInsideJScrollPane() {
        parentPanel = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(new Dimension(800, 600));
            }

            @Override
            public void paintComponent(Graphics g) {
                int margin = 10;
                Dimension dim = getSize();
                super.paintComponent(g);
                g.setColor(Color.DARK_GRAY);
                g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
            }
        };
        parentPanel.setLayout(new GridLayout(0, 1));
        childOne = new JPanel() {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 300);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(500, 300);
            }

            @Override
            public void paintComponent(Graphics g) {
                int margin = 10;
                Dimension dim = getSize();
                super.paintComponent(g);
                g.setColor(Color.GREEN);
                g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
            }
        };
        childTwo = new JPanel() {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 300);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(600, 400);
            }

            @Override
            public void paintComponent(Graphics g) {
                int margin = 10;
                Dimension dim = getSize();
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
            }
        };
        childThree = new JPanel() {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 300);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(800, 600);
            }

            @Override
            public void paintComponent(Graphics g) {
                int margin = 10;
                Dimension dim = getSize();
                super.paintComponent(g);
                g.setColor(Color.ORANGE);
                g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
            }
        };
        parentPanel.add(childOne);
        parentPanel.add(childTwo);
        parentPanel.add(childThree);
        scrollPane.setViewportView(parentPanel);
        scrollPane.getVerticalScrollBar().setUnitIncrement(30);
        scrollPane.getHorizontalScrollBar().setUnitIncrement(30);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                LayoutManager manager = parentPanel.getLayout();
                if ((manager != null) && (manager instanceof BoxLayout)) {
                    parentPanel.setLayout(new GridLayout(0, 1));
                    button.setText("Change, Switch Layout Manager to BoxLayout");
                } else if ((manager != null) && (manager instanceof GridLayout)) {
                    parentPanel.setLayout(new BoxLayout(parentPanel, BoxLayout.PAGE_AXIS));
                    button.setText("Change, Switch Layout Manager to GridLayout");
                }
                parentPanel.revalidate();
                parentPanel.repaint();
            }
        });
        frame.add(scrollPane);
        frame.add(button, BorderLayout.SOUTH);
        frame.setSize(400, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JPanelsInsideJScrollPane();
            }
        });
    }
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • I did as you suggested and I now have a JPanel(container) to which I added the 3 JPanels. I added the container JPanel to the ScrollPane, but now I just get a tiny box that contains nothing. (see above) – bforcer Jun 26 '14 at 06:59
  • depends of (my point 3rd) how the childs to returns its PreferredSize back to the container (JPanel), you can to set [PreferredSize to parent JPanel by using getPreferredSize (correct ways)](http://stackoverflow.com/a/7760310/714968) – mKorbel Jun 26 '14 at 07:03
  • pretty sure I implemented what you suggested. I added the code edited in above after the specPanel is created (SpecPanel is the Jpanel that the chart sits in). Is that what you meant? – bforcer Jun 26 '14 at 07:22
  • not ComponentListener isn't good way, I'll edit my post with something about – mKorbel Jun 26 '14 at 07:24