sirve setsize setpreferredsize setlayout redimensionar que para ejemplos ejemplo componentes java swing resize jgoodies flowlayout

java - setsize - Obtenga el tamaño preferido de flowlayout multilínea



setsize java para que sirve (3)

No puedo encontrar la manera de cambiar el tamaño de algunos componentes en una GUI de swing. 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.

Si usa esto, donde se agrega FlowLayout a xy (3, y)

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

FlowLayout se expande y aparece una barra de desplazamiento

Si usas

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

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

Me gustaría expandir 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 de 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.

Fuentes

[edit] Después de haber tratado de averiguar cómo hacer esto durante semanas, la pregunta actual puede resumirse a esto:
Se está agregando 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 tras otro (verticalmente).

Aquí hay un intento de usar 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); } }


Me gustaría expandir 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 maneja esto.


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


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