2012-01-12 10 views
7

No puedo encontrar la manera de cambiar el tamaño de algunos componentes en una GUI de oscilación. Algunas etiquetas personalizadas se están agregando a un FlowLayout que no se comporta como deberían al cambiar el tamaño del diálogo. El panel se está construyendo utilizando el marco de formularios jgoodies.Obtenga el tamaño preferido de la distribución de flujo multilínea

Si el uso de este, en donde se añade el FlowLayout a XY (3, Y)

FormLayout layout = new FormLayout("r:d, 5px, f:d:g", // columns 
      "p, p, 5px, p, 5px, p") // rows 

El FlowLayout se expande y una barra de desplazamiento se muestra
tags_scroll

Si se utiliza

FormLayout layout = new FormLayout("r:d, 5px, f:10:g", // columns 
      "p, p, 5px, p, 5px, p") // rows 

FlowLayout utiliza el espacio disponible y los elementos en la segunda línea desaparecen
tags_vanish

Me gustaría ampliar la altura de cada fila que contiene un FlowLayout a la altura actual del componente. Desafortunadamente, el tamaño preferido siempre corresponde a la altura para una sola fila.
¿Sería más apropiado otro diseño? El texto en negrita a la izquierda debe estar alineado a la derecha, seguido de FlowLayout.

Sources

[editar] Después de haber tratado de encontrar la manera de hacer esto durante semanas, la pregunta real puede reanudarse a esto:
se añade un conjunto de etiquetas a un JPanel. Este JPanel debe usar todo el espacio disponible horizontalmente (tamaño de diálogo menos el ancho de la etiqueta de nombre de etiqueta) y expandir según sea necesario verticalmente. Si la altura del JPanel aumenta, se mostrará una barra de desplazamiento vertical (la barra de desplazamiento horizontal nunca estará visible). El diálogo puede mostrar varios JPanels que se mostrarán uno después del otro (verticalmente).

He aquí un intento de utilizar GridBagLayout y WrapLayout:

public class GridBagLayoutTagPanel extends JPanel { 
private static final long serialVersionUID = -441746014057882848L; 
private final int NB_TAGS = 5; 

public GridBagLayoutTagPanel() { 
    setLayout(new GridLayout()); 

    JPanel pTags = new JPanel(new GridBagLayout()); 
    pTags.setBackground(Color.ORANGE); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.ipadx = 5; 
    c.ipady = 5; 

    int rowIndex = 0; 
    for (int i = 0; i < NB_TAGS; i++) { 
     //add tag name 
     JLabel lTagName = new JLabel(String.format("Tag %s:", i)); 
     lTagName.setFont(lTagName.getFont().deriveFont(Font.BOLD)); 
     c.fill = GridBagConstraints.NONE; 
     c.gridx = 0; 
     c.gridy = rowIndex++; 
     pTags.add(lTagName, c); 

     //add tag values 
     JPanel pTag = new JPanel(new BorderLayout()); 
     pTag.add(new JLabel("+"), BorderLayout.LINE_START); //label used to add new tags 
     pTag.add(getWrapPanel(), BorderLayout.CENTER); //the list of tag values 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 1; 
     pTags.add(pTag, c); 
    } 

    //JScrollPane sp = new JScrollPane(pTags); 
    //sp.setBorder(BorderFactory.createEmptyBorder()); 

    add(pTags); 
    } 

private static JPanel getWrapPanel() { 
    JPanel p = new JPanel(new WrapLayout(FlowLayout.LEFT, 5, 0)); 

    for (int i = 0; i < 50; i++) { 
      p.add(new JLabel("t" + i)); 
    } 
    return p; 
} 

public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.getContentPane().add(new GridBagLayoutTagPanel()); 
    f.setSize(new Dimension(500, 300)); 
    f.setVisible(true); 
} 
} 
+0

buena pregunta 1 – mKorbel

+0

¿Ha intentado utilizar la clase 'FormDebugUtils' y/o el' FormDebugPanel'? Estas herramientas de depuración me ayudaron algunas veces para ver qué estaba pasando realmente – Robin

+0

¿Por qué declaras 'FlowLayout' cuando el código indica claramente que se usa' FormLayout'? 'FormLayout! = FlowLayout'. –

Respuesta

3

Con la ayuda de Rob y usando su WrapPanel y ScrollablePanel ahora funciona exactamente como debería

public class GridBagLayoutTagPanel extends JPanel { 
    private final int NB_TAGS = 5; 
    private final int NB_TAGVALUES = 50; 

    public GridBagLayoutTagPanel() { 
    setLayout(new GridLayout()); 

    ScrollablePanel pTags = new ScrollablePanel(new GridBagLayout()); 
    pTags.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT); 
    pTags.setBackground(Color.ORANGE); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.ipadx = 5; 
    c.ipady = 5; 

    int rowIndex = 0; 
    for (int i = 0; i < NB_TAGS; i++) { 
     // add tag name 
     JLabel lTagName = new JLabel(String.format("Tag %s:", i)); 
     lTagName.setFont(lTagName.getFont().deriveFont(Font.BOLD)); 
     c.fill = GridBagConstraints.NONE; 
     c.gridx = 0; 
     c.gridy = rowIndex++; 
     c.weightx = 0; // keep minimum size of the cell containing the label when resizing 
     c.weighty = 0; 
     pTags.add(lTagName, c); 

     // add tag values 
     JPanel pTag = new JPanel(new BorderLayout()); 
     pTag.add(new JLabel("+"), BorderLayout.LINE_START); // label used to add new tags 
     pTag.add(getWrapPanel(), BorderLayout.CENTER); // the list of tag values 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 1; 
     c.weightx = 1; // fill horizontally 
     c.weighty = 1; 
     pTags.add(pTag, c); 
    } 

    JScrollPane sp = new JScrollPane(pTags); 
    sp.setBorder(BorderFactory.createEmptyBorder()); 

    add(sp); 
    } 

    private JPanel getWrapPanel() { 
    JPanel p = new JPanel(new WrapLayout(FlowLayout.LEFT, 5, 0)); 

    for (int i = 0; i < NB_TAGVALUES; i++) { 
     p.add(new JLabel("t" + i)); 
    } 

    p.setSize(400, 1); 
    return p; 
    } 

    public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.getContentPane().add(new GridBagLayoutTagPanel()); 
    f.setSize(new Dimension(500, 300)); 
    f.setVisible(true); 
    } 
} 
11

me gustaría ampliar la altura de cada fila que contiene un FlowLayout a la altura actual del componente. Desafortunadamente, el tamaño preferido siempre corresponde a la altura para una sola fila.

Wrap Layout se encarga de esto.

+0

Esto parece ser exactamente lo que estoy buscando. Marcaré la publicación como respondida cuando haya podido probarla. Me sorprende que ningún administrador de diseño estándar se comporte así porque parece ser un caso de uso bastante común. – Philippe

+0

Ahora he intentado durante dos semanas para que esto funcione sin éxito. Con cada administrador de diseño surgieron diferentes problemas. Utilizando jgoodies FormLayout, el tamaño del componente es 0 cuando se necesita para calcular el alto y el ancho. Con GridBagLayout, el cambio de tamaño automático no se comporta del todo bien (tengo un ejemplo si alguien quiere echar un vistazo). Con SpringLayout, los componentes siempre se expanden verticalmente con Springutilities.makeGrid() y dan como resultado etiquetas que se muestran en una sola línea cuando se usa Springutilities.makecompactGrid(). – Philippe

2

¿Has probado MigLayout? Es el único administrador de diseño que uso, y nunca encontré un diseño que no pudiera lograr.

Cuestiones relacionadas