web-dev-qa-db-fra.com

Comment définir une taille de fenêtre (frame) spécifique dans Java swing?

Mon code ne fonctionne pas:

JFrame frame = new JFrame("mull");

mull panel = new mull();

// add panel to the center of window
frame.getContentPane().add("Center", panel);
frame.setSize(500, 300); // << not working!!!
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack(); // give a suitable size to window automatically
frame.setVisible(true); // make window visible

Je commence à avoir une très petite fenêtre. Comment le réparer?

30
J.Olufsen

Eh bien, vous utilisez à la fois frame.setSize() et frame.pack().

Vous devriez en utiliser un à la fois.

En utilisant setSize(), vous pouvez définir la taille du cadre que vous souhaitez utiliser, mais si vous utilisez pack(), la taille de celui-ci change automatiquement en fonction de la taille des composants qu'il contient. Il ne tiendra pas compte de la taille que vous avez mentionnée plus tôt.

Essayez de supprimer frame.pack() de votre code ou de le mettre avant de définir la taille, puis exécutez-le.

55
gprathour

La plupart des gestionnaires de disposition fonctionnent mieux avec preferredSize d'un composant, et la plupart des interfaces graphiques permettent aux composants qu'ils contiennent de définir leurs propres preferredSizes en fonction de leur contenu ou de leurs propriétés. Pour tirer le meilleur parti de ces gestionnaires de dispositions, appelez pack() sur vos conteneurs de niveau supérieur, tels que vos JFrames, avant de les rendre visibles, car ils demanderont à ces gestionnaires de faire ce qu'ils ont à faire - de disposer leurs composants.

Souvent, lorsque j'ai besoin de jouer un rôle plus direct dans la définition de la taille de l'un de mes composants, je redéfinis getPreferredSize et le renvoie à une dimension plus grande que super.preferredSize (ou, dans le cas contraire, renvoie les super valeur).

Par exemple, voici une petite application glisser-rectangle que j'ai créée pour autre question sur ce site :

import Java.awt.*;
import Java.awt.event.*;
import javax.swing.*;

public class MoveRect extends JPanel {
   private static final int RECT_W = 90;
   private static final int RECT_H = 70;
   private static final int PREF_W = 600;
   private static final int PREF_H = 300;
   private static final Color DRAW_RECT_COLOR = Color.black;
   private static final Color DRAG_RECT_COLOR = new Color(180, 200, 255);
   private Rectangle rect = new Rectangle(25, 25, RECT_W, RECT_H);
   private boolean dragging = false;
   private int deltaX = 0;
   private int deltaY = 0;

   public MoveRect() {
      MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
      addMouseListener(myMouseAdapter);
      addMouseMotionListener(myMouseAdapter);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (rect != null) {
         Color c = dragging ? DRAG_RECT_COLOR : DRAW_RECT_COLOR;
         g.setColor(c);
         Graphics2D g2 = (Graphics2D) g;
         g2.draw(rect);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private class MyMouseAdapter extends MouseAdapter {

      @Override
      public void mousePressed(MouseEvent e) {
         Point mousePoint = e.getPoint();
         if (rect.contains(mousePoint)) {
            dragging = true;
            deltaX = rect.x - mousePoint.x;
            deltaY = rect.y - mousePoint.y;
         }
      }

      @Override
      public void mouseReleased(MouseEvent e) {
         dragging = false;
         repaint();
      }

      @Override
      public void mouseDragged(MouseEvent e) {
         Point p2 = e.getPoint();
         if (dragging) {
            int x = p2.x + deltaX;
            int y = p2.y + deltaY;
            rect = new Rectangle(x, y, RECT_W, RECT_H);
            MoveRect.this.repaint();
         }
      }
   }

   private static void createAndShowGui() {
      MoveRect mainPanel = new MoveRect();

      JFrame frame = new JFrame("MoveRect");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Notez que ma classe principale est un JPanel et que je remplace le getPreferredSize de JPanel:

public class MoveRect extends JPanel {
   //.... deleted constants

   private static final int PREF_W = 600;
   private static final int PREF_H = 300;

   //.... deleted fields and constants

   //... deleted methods and constructors

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

Notez également que lorsque j'affiche mon interface graphique, je la place dans une image JFrame, appelle pack(); sur l'image JFrame, définit sa position, puis appelle setVisible(true); sur mon image JFrame:

   private static void createAndShowGui() {
      MoveRect mainPanel = new MoveRect();

      JFrame frame = new JFrame("MoveRect");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}