7
votes

Comment définir une taille de jframe pour s'adapter à la CardLayout affiché JPanel?

J'ai un jframe contenant un ensemble de jPanels dans un cardlayout . Chaque jPanel a une taille différente et je veux que le jframe se adapte à la taille du jPanel actuel affiché (pas le jPanel < / code> pour s'adapter à la taille du jframe ).

Comment puis-je y parvenir?


6 commentaires

"Je veux que le jframe s'adapte à la taille de l'affichage de JPANel actuel" Il se sentait étrange que l'utilisateur ait une taille de changement de trame simplement parce que le contenu affiché change.


Avoir une taille du correctif JFRAME est assez moche lorsque le panneau intérieur ne correspond pas. Je l'ai essayé.


Je ne suis pas sûr que cela fonctionnera mais vous pouvez essayer ceci: cadre.setsize (panneau.gepreferredSize ());


"Je l'ai essayé." Montre-moi. J'ai le sentiment que c'est plus que l'espace supplémentaire des panneaux ne soit pas attribué de manière «Visuellement agréable». Cela ne veut pas dire que c'est impossible à faire.


@Harryjoy de la mémoire vague La taille préférée du panneau avec CL est celle de la plus grande PREF . taille de tout composant dedans.


S'il vous plaît montrer un SSCCE pour expliquer exactement ce que vous voulez réaliser


4 Réponses :


2
votes

Je pense que vous pouvez avoir le mauvais gestionnaire de mise en page pour ce que vous voulez faire (en laissant de côté, pour le moment, que je ne suis pas sûr de vouloir faire ce que vous dites que vous voulez faire).

Je n'ai pas Pourtant, a trouvé une documentation sur ce que je soupçonne, qui est que Cardlayout redimensionne tous ses enfants à la taille de son conteneur. J'ai trouvé le commentaire suivant pour sa méthode "LayoutContainer": xxx

Je pense que c'est un comportement raisonnable, car il serait très gênant que l'utilisateur ait la taille du panneau de sauter Ainsi, lorsque des panneaux sont traversés.

Si c'est vraiment le comportement que vous voulez, alors je pense que vous voulez un gestionnaire de mise en page différent. Et puisqu'il s'agit d'un comportement inhabituel pour une interface utilisateur en général, vous risquez de ne pas trouver une standard à faire cette «fonctionnalité» particulière, vous devrez donc avoir à écrire votre propre.


0 commentaires

4
votes

Voici le SSCCE .

1) Pour une augmentation continue / diminution de la taille, vous devez rechercher certains API d'animation. P>

ou p>

2) Si ce n'est-il pas une tâche de base avec sortie à l'interface graphique, vous pouvez suspendre lors du dimensionnement du jframe code>. Dans ce cas, vous retarderiez l'augmentation / la diminution en utilisant thread # Sleep (int) code> enveloppé dans filnable code> thread. P>

3) Avis (non Pour op) à l'aide de thread # Sleep (int) code> directement pendant EDT serait gèle jusqu'à ce que le délai s'est terminé. P>

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;
//based on HFOE http://stackoverflow.com/questions/5414177/change-size-of-jpanel-using-cardlayout/5414770#5414770
public class MultiSizedPanels {

    private static void createAndShowUI() {
        final CardLayout cardLayout = new CardLayout();
        final JPanel cardHolder = new JPanel(cardLayout);
        final JFrame frame = new JFrame("MultiSizedPanels");
        JLabel[] labels = {
            new JLabel("Small Label", SwingConstants.CENTER),
            new JLabel("Medium Label", SwingConstants.CENTER),
            new JLabel("Large Label", SwingConstants.CENTER)};

        for (int i = 0; i < labels.length; i++) {
            int padding = 50;
            Dimension size = labels[i].getPreferredSize();
            size = new Dimension(size.width + 2 * (i + 1) * padding, size.height + 2 * (i + 1) * padding);
            labels[i].setPreferredSize(size);
            Border lineBorder = BorderFactory.createLineBorder(Color.blue);
            labels[i].setBorder(lineBorder);
            JPanel containerPanel = new JPanel();
            if (i == 1) {
                containerPanel.setPreferredSize(new Dimension(300, 200));
                containerPanel.add(labels[i], BorderLayout.CENTER);
                cardHolder.add(containerPanel, String.valueOf(i));
            } else if (i == 2) {
                containerPanel.setPreferredSize(new Dimension(600, 400));
                containerPanel.add(labels[i], BorderLayout.CENTER);
                cardHolder.add(containerPanel, String.valueOf(i));
            } else {
                containerPanel.setPreferredSize(new Dimension(800, 600));
                containerPanel.add(labels[i], BorderLayout.CENTER);
                cardHolder.add(containerPanel, String.valueOf(i));
            }
        }
        JButton nextButton = new JButton("Next");
        nextButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                cardLayout.next(cardHolder);
                Dimension dim = new Dimension();
                for (Component comp : cardHolder.getComponents()) {
                    if (comp.isVisible() == true) {
                        dim = comp.getPreferredSize();
                    }
                }
                frame.setPreferredSize(dim);
                java.awt.EventQueue.invokeLater(new Runnable() {

                    public void run() {
                        frame.pack();
                    }
                });
            }
        });
        JPanel btnHolder = new JPanel();
        btnHolder.add(nextButton);

        frame.add(cardHolder, BorderLayout.CENTER);
        frame.add(btnHolder, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                createAndShowUI();
            }
        });
    }
}


1 commentaires

-1 Pour une utilisation excessive de SetPréfsize: la règle générale est (comme vous le savez bien :-) Pour résoudre les problèmes de dimensionnement en utilisant un layoutManager approprié. Si vous ne trouvez pas un qui fait ce que vous voulez, écrivez / ajustez un licageManager qui fait ...



15
votes

Le général est: Si vous avez un problème de mise en page, TOUJOURS le résolvez avec un layoutManager approprié. NE JAMAIS Tweak Un composant indice de dimensionnement d'un composant pour atteindre votre objectif.

Dans ce cas, il est particulièrement facile d'ajuster le CardLayout. Par défaut, il calcule sa préfsize au maximum de préféts de toutes les cartes. Simplement sous-classe et mettre en œuvre pour renvoyer les préfsize (plus embarquer) de la carte actuellement visible: xxx

Utilisation de celle-ci (Emprunt @ Mkorbel's Exemple), la méthode principale rétrécit proprement: < / p> xxx


2 commentaires

Merci. C'est plus propre et exactement ce que je voulais.


Si propre que je ne peux pas y croire. Merci!



0
votes
Try this code this may help you.




protected void paintComponent(Graphics g) {
if (getModel().isArmed()) {
      g.setColor(Color.lightGray);
} else {
     g.setColor(getBackground());
}
g.fillOval(0, 0, getSize().width-1, getSize().height-1);
System.out.println("width is "+getSize().width+"height is "+getSize().height);
super.paintComponent(g);
}
protected void paintBorder(Graphics g) {
g.setColor(getForeground());
g.drawOval(0, 0, getSize().width-1, getSize().height-1);
}
Shape shape;
public boolean contains(int x, int y) {
if (shape == null || !shape.getBounds().equals(getBounds())) {
     shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight());
}
return shape.contains(x, y);
}}

0 commentaires