Frage

Ich habe einen enthält Panel JPanel mit einem Fluss-Layout, die enthält Panel ist in einem JScrollPane , enthält Panel hält ein Bündel von anderen JPanels , Innenverkleidungen, in ihm. Alle Innenplatten haben die gleichen Abmessungen. Wenn es mehr Platten sind dann der enthält Panel in seinem halte Breite dann sie gerastert nach unten sind, und wenn es mehr Platten dann der enthält Panel kann in seiner Höhe , und die inneren Platten im gleichen Raster mit Ausnahme der letzten Reihe ausgerichtet sind, die mit der Reihe vorletzten zentriert ist.

Während ich die Größe des Dialog des enthält Panel erweitert und das Layout Flow Layout seine Pflicht erfüllen, aber die Scrollbalken nicht angezeigt werden, obwohl die Größe des Panels die Grenzen der überschreitet JScrollPane .

Wie kontrolliere ich das Aussehen der Bildlaufleisten, wenn ich den enthält Panel die Größe dynamisch?

wie für die Bilder, sie sollten es zusammenzufassen:

alt text

Nachdem das Dialogbreite erstreckt:

alt text

Adam

War es hilfreich?

Lösung

Sie müssen das enthält Panel implementieren Scrollable machen, und stellen Sie die bevorzugte scrollbaren Darstellungsgröße entsprechend der Breite.

import java.awt.*;
import javax.swing.*;

public class Test
{
    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JPanel container = new ScrollablePanel();
                container.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
                for( int i = 0; i < 20; ++i )
                {
                    JPanel p = new JPanel();
                    p.setBorder(BorderFactory.createLineBorder(Color.RED));
                    p.setPreferredSize(new Dimension(50, 50));
                    p.add(new JLabel("" + i));
                    container.add(p);
                }

                JScrollPane scroll = new JScrollPane(container);
                scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

                JFrame f = new JFrame("Test");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                    
                f.getContentPane().add(scroll);                    
                f.pack();
                f.setSize(250, 300);
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}

class ScrollablePanel extends JPanel implements Scrollable
{
    public Dimension getPreferredSize()
    {
        return getPreferredScrollableViewportSize();
    }

    public Dimension getPreferredScrollableViewportSize()
    {
        if( getParent() == null )
            return getSize();
        Dimension d = getParent().getSize();
        int c = (int)Math.floor((d.width - getInsets().left - getInsets().right) / 50.0);
        if( c == 0 )
            return d;
        int r = 20 / c;
        if( r * c < 20 )
            ++r;
        return new Dimension(c * 50, r * 50);
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction)
    {
        return 50;
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
    {
        return 10;
    }

    public boolean getScrollableTracksViewportHeight()
    {
        return false;
    }

    public boolean getScrollableTracksViewportWidth()
    {
        return getParent() != null ? getParent().getSize().width > getPreferredSize().width : true;
    }
}

Alle Zahlen werden der Einfachheit halber fest einprogrammiert, aber man sollte die Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top