7
votes

Définir la taille maximale de JPanel à l'intérieur BorderLayout.Center

J'ai un JPanel à l'intérieur de la bordureLayout.Center

Le JPANEL a une disposition de la grille, et je veux qu'il se développe avec le centre de sa largeur, mais la hauteur doit s'arrêter à un maximum et utiliser le préféré lorsque cela est possible. < / p>

J'ai ce code xxx

CenterPanel est mon panneau (utilise Gridlayout), je l'enveloppe avec un panneau Flowlayout et mettez ce dernier dans Le centre.

La taille est préférée, mais elle est corrigée !! La hauteur ne diminue pas si nécessaire, et la largeur ne fait pas non plus la largeur.

Comment puis-je faire cela?


0 commentaires

3 Réponses :


4
votes

Je pense que cela n'est pas possible avec BorderLayout, en particulier pour la zone limiteLayout.Center, ni sans la SIDE_EFFECTS comme Blinking UFO à l'écran à partir du code

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


0 commentaires

2
votes

le flowlayout Layout Manager ne redistribue pas l'espace libre; Il utilise la taille préférée de chaque composant (voir Documentation FlowLayout dans l'API Java).

Je modifierai personnellement le gestionnaire de mise en page de votre panneau d'emballage sur un Gridbaglayout et ajoutez votre CenterPanel , Spécifiez un GridbagConstraints objet à gérer la distribution d'espace comme vous en avez besoin.


0 commentaires

16
votes

Essayez d'utiliser un boxlayout comme panneau d'enveloppe. Un boxlayout respecte la taille maximale / minimale et préférée d'un composant.


1 commentaires

De nombreux gestionnaires de mise en page ignorent la taille maximale. Je ne pense pas que le bug que vous avez mentionné est un problème de gestionnaire de mise en page.