Question

So I have a JPanel in a JScrollPane, which encompasses a GridLayout filled with other panels (so that I could set their size to an absolute). The sizes of each of the panels and the scrollpane are defined using SetPreferredSize(), and scrolling works. However, everything below the initial view is cut off, making scrolling down useless. Here's a picture of what I mean: enter image description here

There should be additional fields below. How do I ensure they appear?

Edit: Code snippet:

public Volume_Stacks_Builder2 () {
    super("Volume Stacks Builder");
    instance = this;
    addKeyListener(IJ.getInstance());
    setLayout(new FlowLayout());
    panel = new Panel();
    wList = WindowManager.getIDList();
    if (wList==null) {
        IJ.noImage();
        //return false;
    }
    panel.setLayout(new GridLayout(wList.length * 3 + 3, 1));
    framesC = new int[wList.length];
    framesD = new int[wList.length];
    frameBoxes = new JComboBox[wList.length];
    diastoleSlices = new JFormattedTextField[wList.length];
    cystoleSlices = new JFormattedTextField[wList.length];
    String[] titles = new String[wList.length];
    for (int i=0; i<wList.length; i++) {
        ImagePlus imp = WindowManager.getImage(wList[i]);
        titles[i] = imp!=null?imp.getTitle():"";
    }

    int firstStackSize = WindowManager.getImage(wList[0]).getStack().getSize();
    for (int i = 0; i < wList.length; i++) {
        JPanel fPanel = new JPanel();
        fPanel.setMinimumSize(new Dimension(450, 25));
        fPanel.setPreferredSize(new Dimension(450, 25));
        fPanel.setMaximumSize(new Dimension(450, 25));
        JLabel flabel = new JLabel("Frame " + (i + 1) +  " image:");
        flabel.setPreferredSize(new Dimension(200, 25));
        fPanel.add(flabel);
        frameBoxes[i] = new JComboBox(titles);
        frameBoxes[i].setSelectedIndex(i);
        frameBoxes[i].setPreferredSize(new Dimension(200, 25));
        fPanel.add(frameBoxes[i]);
        panel.add(fPanel);

        JPanel dPanel = new JPanel();
        dPanel.setMinimumSize(new Dimension(450, 25));
        dPanel.setPreferredSize(new Dimension(450, 25));
        dPanel.setMaximumSize(new Dimension(450, 25));
        JLabel dLabel = new JLabel("End disastole slice: ");
        dLabel.setPreferredSize(new Dimension(200, 25));
        dPanel.add(dLabel);
        diastoleSlices[i] = new JFormattedTextField(sliceFormat);
        diastoleSlices[i].setValue(new Integer(1));
        diastoleSlices[i].setPreferredSize(new Dimension(200, 25));
        dPanel.add(diastoleSlices[i]);
        panel.add(dPanel);

        JPanel sPanel = new JPanel();
        sPanel.setMinimumSize(new Dimension(450, 25));
        sPanel.setPreferredSize(new Dimension(450, 25));
        sPanel.setMaximumSize(new Dimension(450, 25));
        JLabel sLabel = new JLabel("End systole slice: ");
        sLabel.setPreferredSize(new Dimension(200, 25));
        sPanel.add(sLabel);
        cystoleSlices[i] = new JFormattedTextField(sliceFormat);
        cystoleSlices[i].setValue(new Integer(firstStackSize / 2));
        cystoleSlices[i].setPreferredSize(new Dimension(200, 25));
        sPanel.add(cystoleSlices[i]);
        panel.add(sPanel);
    }
    JPanel dtPanel = new JPanel();
    dtPanel.setMinimumSize(new Dimension(450, 25));
    dtPanel.setPreferredSize(new Dimension(450, 25));
    dtPanel.setMaximumSize(new Dimension(450, 25));
    JLabel dLabel = new JLabel("Diastole stack title:");
    dLabel.setPreferredSize(new Dimension(200, 25));
    dtPanel.add(dLabel);
    dStackTitle = new JTextArea(titleD);
    dStackTitle.setPreferredSize(new Dimension(200, 25));
    dtPanel.add(dStackTitle);
    panel.add(dtPanel);

    JPanel stPanel = new JPanel();
    stPanel.setMinimumSize(new Dimension(450, 25));
    stPanel.setPreferredSize(new Dimension(450, 25));
    stPanel.setMaximumSize(new Dimension(450, 25));
    JLabel sLabel = new JLabel("Systole stack title:");
    sLabel.setPreferredSize(new Dimension(200, 25));
    stPanel.add(sLabel);
    sStackTitle = new JTextArea(titleC);
    sStackTitle.setPreferredSize(new Dimension(200, 25));
    stPanel.add(sStackTitle);
    panel.add(stPanel);

    JPanel subPanel = new JPanel();
    subPanel.setMinimumSize(new Dimension(450, 25));
    subPanel.setPreferredSize(new Dimension(450, 25));
    subPanel.setMaximumSize(new Dimension(450, 25));
    JButton submit = new JButton("Submit");
    submit.addActionListener(this);
    submit.setPreferredSize(new Dimension(450, 25));
    subPanel.add(submit);
    panel.add(subPanel);

    JScrollPane scrollPane = new JScrollPane(panel);
    scrollPane.setPreferredSize(new Dimension(450, 400));
    scrollPane.setMaximumSize(new Dimension(450, 400));
    scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    this.add(scrollPane);
    pack();
    GUI.center(this);
    setVisible(true);
}
Was it helpful?

Solution

Your problem is likely because you are setting sizes or preferred sizes, in particular the JPanel that is held in the JScrollPane's viewport. Don't set its size. Also you will want to avoid setting absolute sizes of your sub components as well.

For better help, show code, preferably a minimal example program.


Edit

  • Also, there are other often times better ways of indicating desired sizes, including use of a JTextField's column property.
  • Also, I wonder if you really want to use a JTable to display your tabular data. It seems as if it would be a natural fit.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top