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 p> CenterPanel est mon panneau (utilise Gridlayout), je l'enveloppe avec un panneau Flowlayout et mettez ce dernier dans Le centre. p> 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. P> Comment puis-je faire cela? P> p>
3 Réponses :
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);
}
}
le Je modifierai personnellement le gestionnaire de mise en page de votre panneau d'emballage sur un flowlayout code> 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). p>
Gridbaglayout CODE> et ajoutez votre CenterPanel CODE>, Spécifiez un GridbagConstraints code> objet à gérer la distribution d'espace comme vous en avez besoin. p>
Essayez d'utiliser un boxlayout comme panneau d'enveloppe. Un boxlayout respecte la taille maximale / minimale et préférée d'un composant. P>
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.