Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automatic wrapping using MigLayout

I'm looking to wrap a JPanel when it reaches the 'edge' of the screen using MigLayout. At the moment I have a JScrollPane (which I only want to be enabled vertically). The JScrollPane contains any number of JPanels which are arranged horizontally - when a panel is added so that the JPanel would go off the edge I want it to add to the next line. Is this possible?

This is the code:

public void setupPanels(){
    JScrollPane scrollPane = new JScrollPane();
    JPanel mainPanel = new JPanel(new MigLayout("insets 2"));

    for (Object object : objects){
        JPanel subPanel = new JPanel(new MigLayout("insets 0")); 
        mainPanel.add(subPanel, "alignx left, gapx 2px 5px, gapy 2px 2px, top");
    }

    scrollPane.setViewportView(mainPanel);
}

Also, to add an extra factor, every time it reaches the edge I need to add a new/different panel (a timeline) - so is there a way of finding out when it is going to wrap onto a new line?

Thanks

like image 304
maloney Avatar asked Nov 03 '22 11:11

maloney


1 Answers

MigLayout does not have such a feature. It is based on a grid and while you can use the nogrid option to flow components horizontally or vertically in a cell span, you cannot make them flow into the next row or column.

The java.awt.FlowLayout contained in the JDK wraps the contained components automatically:

JPanel mainPanel = new JPanel(new FlowLayout());
mainPanel.add(subPanel1);
mainPanel.add(subPanel2);
mainPanel.add(subPanel3);
...

The preferred height is off, but there are ways to fix this, see WrapLayout.

As for the second requirement:

Also, to add an extra factor, everytime it reaches the edge I need to add a new/different panel (A timeline) - so is there a way of finding out when it is going to wrap onto a new line?

A layout manager should layout components that have already been added to a container, not add new components based on the results of the layout. Adding invisible placeholder components for the timeline after each subpanel that are made visible by the layout manager on demand might work.

You definitely need a custom layout manager to do this. To get started I would recommend to take the source of FlowLayout. In the layoutContainer implementation there is a loop that iterates over all components. After a line wrap, check if the next component is a timeline placeholder component, make it visible and wrap again.

like image 96
Ingo Kegel Avatar answered Nov 11 '22 16:11

Ingo Kegel