Изменение размера панели с макетом потока не вызывает полосы прокрутки

StackOverflow https://stackoverflow.com/questions/3868093

Вопрос

у меня есть содержащие панель Jpanel. с раскладкой потока, содержащие панель в а Jscrollpane., то содержащие панель держит кучу других Jpanels., Внутренние панели, в нем. Все внутренние панели имеют одинаковые размеры. Если есть больше панелей, то содержащие панель может держать в своем ширина Затем они скрещены вниз, и если есть больше панелей, то содержащие панель может держать в своем высота, Затем внутренние панели выровнены в той же сетке, за исключением последнего ряда, который сосредоточен с ряд до последнего.

Пока я изменил размер диалога содержащие панель Расширения и раскладки раскладки выполняют свой долг, но полосы прокрутки не появляются, хотя размер панели превышает границы Jscrollpane..

Как мне контролировать появление полос прокрутки, когда я изменил размер содержащие панель Динамически?

Что касается изображений, они должны суммировать это:

alt text

После продления диалогового окна ширина:

alt text

Адам

Это было полезно?

Решение

Вам нужно сделать систему, содержащую панель Scrollable, и установите предпочтительную прокручиваемую размер просмотра в зависимости от ширины.

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;
    }
}

Все номера заканчиваются для простоты, но вы должны получить идею.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top