Как установить определенный размер окна (фрейма) в java swing? - PullRequest
28 голосов
/ 19 ноября 2011

Мой код не работает:

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

У меня очень маленькое окно.Как это исправить?

Ответы [ 2 ]

53 голосов
/ 19 ноября 2011

Ну, вы используете frame.setSize() и frame.pack().

Вы должны использовать один из них одновременно.

Используя setSize(), вы можете указать желаемый размер кадра, но если вы используете pack(), он автоматически изменит размер кадров в соответствии с размером компонентов в нем. Он не будет учитывать размер, который вы упомянули ранее.

Попробуйте удалить frame.pack() из кода или поставить его перед установкой размера, а затем запустить его.

8 голосов
/ 19 ноября 2011

Большинство менеджеров компоновки лучше всего работают с компонентом предпочитаемым размером, а большинство графических интерфейсов лучше всего позволяют компонентам, которые они содержат, устанавливать свои собственные предпочтительные размеры на основе их содержимого или свойств. Чтобы использовать эти менеджеры компоновки с максимальной выгодой, вызовите pack() для ваших контейнеров верхнего уровня, таких как ваши JFrames, перед тем, как сделать их видимыми, поскольку это скажет этим менеджерам выполнить их действия - расположить их компоненты.

Часто, когда мне нужно было играть более непосредственную роль в настройке размера одного из моих компонентов, я переопределяю getPreferredSize и возвращаю Dimension, который больше super.preferredSize (или если нет, то он возвращает значение супер).

Например, вот небольшое приложение с перетаскиванием прямоугольника, которое я создал для еще один вопрос на этом сайте :

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();
         }
      });
   }
}

Обратите внимание, что мой основной класс - это JPanel, и я переопределяю getPreferredSize в 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);
   }

Также обратите внимание, что когда я отображаю свой графический интерфейс, я помещаю его в JFrame, вызываю pack(); на JFrame, устанавливаю его положение, а затем вызываю setVisible(true); на моем 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();
         }
      });
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...