J'ai un Comment puis-je y parvenir? p> jframe code> contenant un ensemble de
jPanels code> dans un
cardlayout code>. Chaque
jPanel code> a une taille différente et je veux que le
jframe code> se adapte à la taille du
jPanel actuel affiché code> (pas le
jPanel < / code> pour s'adapter à la taille du
jframe code>). p>
4 Réponses :
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": p> 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. p> 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. P> p>
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 3) Avis (non Pour op) à l'aide de jframe code>. Dans ce cas, vous retarderiez l'augmentation / la diminution en utilisant
thread # Sleep (int) code> enveloppé dans
filnable code> thread. P>
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 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 ...
Le général est: Si vous avez un problème de mise en page, 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: p> Utilisation de celle-ci (Emprunt @ Mkorbel's Exemple), la méthode principale rétrécit proprement: < / p>
Merci. C'est plus propre et exactement ce que je voulais.
Si propre que je ne peux pas y croire. Merci!
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); }}
"Je veux que le jframe s'adapte à la taille de l'affichage de JPANel actuel" I> 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 ()); code>
"Je l'ai essayé." I> 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 i> PREF i>. taille de tout composant dedans.
S'il vous plaît montrer un SSCCE pour expliquer exactement ce que vous voulez réaliser