2011-10-13 13 views
5

tengo un JPanel dentro BorderLayout.CENTERestablecer el tamaño máximo de JPanel dentro BorderLayout.CENTER

El JPanel tiene un diseño de cuadrícula, y quiero que se expanda con el centro de su anchura, pero la altura debe detenerse en un máximo y use el tamaño preferido cuando sea posible.

tengo este código

JPanel wrapperCenterPanel = new JPanel(new FlowLayout()); 
wrapperCenterPanel.add(centerPanel);  
panel.add(wrapperCenterPanel, BorderLayout.CENTER); 

centerPanel es mi panel (utiliza GridLayout), estoy envolviéndolo con un panel FlowLayout, y poner este último en el centro.

¡Ahora el tamaño es el preferido, pero está arreglado! La altura no se reduce si es necesario, y tampoco lo hace el ancho.

¿Cómo puedo hacer esto?

Respuesta

15

Pruebe usar BoxLayout como panel de envoltura. Un BoxLayout respeta el tamaño máximo/mínimo y preferido de un componente.

+0

Muchos administradores de diseño ignoran el tamaño máximo. No creo que el error al que se refirió sea un problema de administrador de diseño. – camickr

4

creo que no es posible con BorderLayout, especialmente para el área BorderLayout.CENTER, ni sin side_effects como el parpadeo en la pantalla UFO del código

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ComponentEvent; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 

public class CustomComponent extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public CustomComponent() { 
     setTitle("Custom Component Graphics2D"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void display() { 
     CustomComponents cc = new CustomComponents(); 
     cc.addComponentListener(new java.awt.event.ComponentAdapter() { 

      @Override 
      public void componentResized(ComponentEvent event) { 
       setSize(Math.min(getPreferredSize().width, getWidth()), 
         Math.min(getPreferredSize().height, getHeight())); 
      } 
     }); 
     add(cc, BorderLayout.CENTER); 

     CustomComponents cc1 = new CustomComponents(); 
     add(cc1, BorderLayout.EAST); 

     pack(); 
     // enforces the minimum size of both frame and component 
     setMinimumSize(getSize()); 
     //setMaximumSize(getMaximumSize()); 
     setVisible(true); 

    } 

    public static void main(String[] args) { 
     CustomComponent main = new CustomComponent(); 
     main.display(); 
    } 
} 

class CustomComponents extends JComponent { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Dimension getMinimumSize() { 
     return new Dimension(100, 100); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 300); 
    } 

    @Override 
    public Dimension getMaximumSize() { 
     return new Dimension(800, 600); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     int margin = 10; 
     Dimension dim = getSize(); 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); 
    } 
} 
1

El gerente FLowLayout diseño no redistribuye el espacio libre; usa el tamaño preferido de cada componente (consulte la documentación de FlowLayout en la API de Java).

personalmente cambiaría controlador de distribución de su panel de envoltura para un GridBagLayout, y añadir su centerPanel en él, especifique un GridBagConstraints objeto adecuado para manejar la distribución de espacio que necesite.

Cuestiones relacionadas