2011-06-10 7 views
5

Estoy buscando un LayoutManager que me permita mostrar un conjunto de componentes en un contenedor (por ejemplo, un JPanel), en columnas, aproximadamente de la siguiente manera.Swing: administrador de disposición de flujo de columna?

  • El ancho del contenedor es una restricción de entrada.
  • altura preferida del contenedor es una función de la anchura, y es o bien:
    • la altura mínima necesaria para obtener los componentes para encajar dentro de la anchura, cuando presenta en más de una columna.
    • la altura mínima necesaria para que los componentes quepan en una sola columna.
  • Los componentes se colocarán en orden de periódico-columna, de arriba a abajo y luego de izquierda a derecha.

Aquí hay un ejemplo (pantalla de texto de baja tecnología) que muestra 13 componentes. Si pueden ajustarse en 3 columnas, que se vería así:

Foo1 Foo6  Foo11 
Foo2 Foo7  Foo12 
Foo3 Foo8  Foo13 
Foo4 Foo9  
Foo5 Foo10 

Si eso es demasiado amplia, se verían así:

Foo1 Foo8 
Foo2 Foo9 
Foo3 Foo10 
Foo4 Foo11 
Foo5 Foo12 
Foo6 Foo13 
Foo7  

Y si eso es demasiado ancho, se verían de esta manera:

Foo1  
Foo2  
Foo3  
Foo4  
Foo5  
Foo6  
Foo7  
Foo8 
Foo9 
Foo10 
Foo11 
Foo12 
Foo13 

¿hay un LayoutManager preexistente que pueda utilizar o subclase de hacer algo como esto?


editar: esto está muy cerca de this other question about vertical layout, pero ese diseño tiene la altura componente que es la restricción, y la mía tiene el ancho componente que es una restricción.

Respuesta

1

es posible que desee ver en GribBagLayout http://download.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

Con diseño GridBag conocer el tamaño se puede establecer el número de componentes que tendría en una fila en particular.

pero si no me equivoco, no deberías hacer exactamente lo que quieras.

vamos con las etiquetas simples. si el tamaño * 2 de la etiqueta es más largo que el ancho, entonces mostrará solo 1 etiqueta por fila. y así.

aquí es un ejemplo que debería aclararlo

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class GridLayoutDemo implements ActionListener{ 
    JTextField j1; 
    JTextField j2; 
    JFrame f; 
    public void show(){ 
     j1=new JTextField("x dimention"); 
     j2=new JTextField("y dimention"); 
     f=new JFrame(); 
     JPanel p=new JPanel(); 
     JLabel l2=new JLabel("abcdefghijklmnoqrstuvw"); 
     JLabel l1=new JLabel("abcdefghijklmnoqrstuvw"); 
     JLabel l3=new JLabel("abcdefghijklmnoqrstuvw"); 
     JLabel l4=new JLabel("abcdefghijklmnoqrstuvw"); 
     JButton b=new JButton("new size"); 
     b.addActionListener(this); 

     p.add(l1); 
     p.add(l2); 
     p.add(l3); 
     p.add(l4); 
     p.add(j1); 
     p.add(j2); 
     p.add(b); 
     f.setSize(400, 200); 
     f.add(p); 

     //f.pack(); 
     f.setVisible(true); 

    } 

    public static void main(String[] args){ 
     GridLayoutDemo g=new GridLayoutDemo(); 
     g.show(); 
    } 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 
     int x=Integer.parseInt(j1.getText()); 
     int y=Integer.parseInt(j2.getText()); 
     f.setSize(x,y); 
     f.setVisible(true); 

    } 
} 
+1

gracias, pero GridBagLayout y otros diseños orientados a la cuadrícula tienen un tamaño de cuadrícula estática. Necesito averiguar el tamaño de la cuadrícula dinámicamente. –

+0

¿Has probado tu propia demostración? Fluye horizontalmente, no verticalmente.(Para su información, no tiene mucho sentido llamar a setSize() cuando puede hacerlo interactivamente cambiando el tamaño del JFrame) –

2

Otro componente que admite este tipo de diseño es JList, que incluye un VERTICAL_WRAP que "Indica un estilo diseño periódico con células que fluye verticalmente a continuación, horizontalmente." Dependiendo de sus necesidades, un adecuado ListCellRenderer, mencionado here, puede ser suficiente.

Cuestiones relacionadas