2011-10-13 11 views
5

Ho un JPanel all'interno BorderLayout.CENTERimpostare la dimensione massima di JPanel all'interno BorderLayout.CENTER

Il JPanel ha un layout a griglia, e voglio di espandersi con il Centro per la sua larghezza, ma l'altezza deve fermarsi un massimo e utilizzare il preferito Dimensione quando possibile.

Ho questo codice

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

centerPanel è il mio pannello (usa GridLayout), sto avvolgendolo con un pannello FlowLayout, e mettendo quest'ultimo al centro.

Ora la dimensione è quella preferita, ma è fissa !! L'altezza non si riduce se necessario, e nemmeno la larghezza.

Come posso fare questo?

risposta

15

Provare a utilizzare BoxLayout come pannello wrapper. Un BoxLayout rispetta la dimensione massima/minima e preferita di un componente.

+0

Molti gestori di layout ignorano la dimensione massima. Non penso che il bug a cui hai fatto riferimento sia un problema di layout manager. – camickr

4

penso che non è possibile con BorderLayout, in particolare per l'area BorderLayout.CENTER, né senza side_effects come lampeggiante UFO sullo schermo dal codice

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

Il manager FLowLayout layout non ridistribuire spazio libero; utilizza la dimensione preferita di ciascun componente (vedere la documentazione FlowLayout nell'API Java).

io personalmente sarebbe cambiato gestore di layout del pannello di involucro ad un GridBagLayout, e aggiungere il centerPanel in esso, specificare una corretta GridBagConstraints oggetto per gestire la distribuzione degli spazi di cui hai bisogno.

Problemi correlati