Pregunta

Tengo un panel que contiene JPanel con un diseño de flujo, la panel que contiene es un JScrollPane , la contiene panel de tiene un montón de otro JPanels , paneles interiores, en ella. Todos los paneles interiores tienen las mismas dimensiones. Si hay más paneles entonces el panel que contiene puede contener en su anchura hacia abajo luego se cuadriculada, y si hay más paneles entonces el panel que contiene puede contener en su altura , a continuación, los paneles interiores están alineados en la misma rejilla con la excepción de la última fila que está centrado con la fila antes de la última.

Mientras que puedo cambiar el tamaño del cuadro de diálogo en el panel que contiene se extiende y el flujo de diseño de layout cumplir con su deber, pero las barras de desplazamiento no aparecen aunque el tamaño del panel es superior a los límites de la JScrollPane .

¿Cómo puedo controlar el aspecto de las barras de desplazamiento cuando cambio el tamaño de la panel que contiene de forma dinámica?

En cuanto a las imágenes, deben resumir:

text alt

Después de extender la anchura de diálogo:

text alt

Adam

¿Fue útil?

Solución

Es necesario para hacer que el panel que contiene implementar Scrollable, y establecer el tamaño de ventana desplazable preferido de acuerdo con la anchura.

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

Todos los números están codificados por simplicidad, pero debe hacerse una idea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top