web-dev-qa-db-fra.com

Taille automatique JPanel à l'intérieur de Jframe

J'ai une sous-classe JPanel sur laquelle je ajoute des boutons, des étiquettes, des tables, etc. Pour afficher à l'écran, j'utilise JFrame:

MainPanel mainPanel = new MainPanel(); //JPanel subclass

JFrame mainFrame = new JFrame();
mainFrame.setTitle("main window title");
mainFrame.getContentPane().add(mainPanel);
mainFrame.setLocation(100, 100);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Mais lorsque je dimensionnez la fenêtre, la taille du panneau ne change pas. Comment faire la taille du panneau pour être identique à la taille de la fenêtre même si elle a été redimensionnée?

11
Igor

Vous pouvez définir un gestionnaire de mise en page comme BorderLayout, puis définir plus spécifiquement, où votre panneau devrait aller:

MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new BorderLayout());
mainFrame.add(mainPanel, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setVisible(true);

Cela met le panneau dans la zone centrale du cadre et le permet de croître automatiquement lors du redimensionnement du cadre.

14
Ole

Vous devez définir un gestionnaire de mise en page pour que le jframe utiliser - cela traite comment les composants sont positionnés. Un responsable utile est le gestionnaire BorderLayout.

L'ajout de la ligne de code suivante doit simplement résoudre vos problèmes:

mainFrame.setLayout(new BorderLayout());

(Faites-le avant d'ajouter des composants au jframe)

2
Richard Walton

Si l'option BorderLayout fournie par nos amis ne fonctionne pas, essayez d'ajouter ComposantListerner au JFRAME et de mettre en œuvre la méthode ComponentréSisée (événement). Lorsque l'objet JFRAME sera redimensionné, cette méthode sera appelée. Donc, si vous écrivez le code pour définir la taille de la JPANEL dans cette méthode, vous obtiendrez le résultat souhaité.

Ya, je sais que cette "solution" n'est pas bonne mais l'utilise comme filet de sécurité. ;)

1
sv_in

De mon expérience, j'ai utilisé Gridlayout.

    thePanel.setLayout(new GridLayout(a,b,c,d));

a = Numéro de rangée, B = Numéro de colonne, C = Gap horizontal, D = écart vertical.


Par exemple, si je veux créer un panneau avec:

  • rangée illimitée (ensemble A = 0)
  • 1 colonne (Set B = 1)
  • gap vertical = 3 (ensemble d = 3)

Le code est ci-dessous:

    thePanel.setLayout(new GridLayout(0,1,0,3));

Cette méthode est utile lorsque vous souhaitez ajouter JScrollPane à votre JPanel. La taille du JPANEL à l'intérieur JScrollPane modifie automatiquement lorsque vous ajoutez des composants à ce sujet, le JScrollPane réinitialisera donc automatiquement la barre de défilement.

1
Luki B. Subekti

Comme les autres affiches l'ont dit, vous devez changer layoutManager utilisé. J'ai toujours préféré utiliser un gridlayout afin que votre code devienne:

MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new GridLayout());
mainFrame.pack();
mainFrame.setVisible(true);

Gridlayout semble plus correct avec moi lorsque vous souhaitez que votre panneau occupe tout l'écran.

0
tddmonkey