如何在java中设置JPanel的大小

如何在java中设置JPanel的大小,java,swing,jpanel,preferredsize,Java,Swing,Jpanel,Preferredsize,我的java代码中有一个JPanel,我想设置它的大小,我使用了JPanel.setSize(500500);和JPanel.setSize(新尺寸(500500));但两者都不起作用。请告诉我如何设置JPanel的大小?大多数Swing布局管理器尊重组件的首选大小,而不是其大小。您可以调用setPreferredSize(新维度(500500)),但这可能会在以后的代码中被覆盖,并导致GUI不灵活。最好重写JPanel的getPreferredSize()方法,并返回一个在所有情况下都最有效的

我的java代码中有一个JPanel,我想设置它的大小,我使用了JPanel.setSize(500500);和JPanel.setSize(新尺寸(500500));但两者都不起作用。请告诉我如何设置JPanel的大小?

大多数Swing布局管理器尊重组件的首选大小,而不是其大小。您可以调用
setPreferredSize(新维度(500500))
,但这可能会在以后的代码中被覆盖,并导致GUI不灵活。最好重写JPanel的
getPreferredSize()
方法,并返回一个在所有情况下都最有效的计算维度

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.*;

public class PrefSizePanel extends JPanel {

   private static final int PREF_W = 500;
   private static final int PREF_H = PREF_W;

   public Dimension getPreferredSize() {
      // update as per Marco:
      if (super.isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   // just for fun
   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setPaint(new GradientPaint(0, 0, Color.red, 20, 20, Color.blue, true));
      g2.fillOval(0, 0, 2 * getWidth(), 2 * getHeight());
   }

   private static void createAndShowGUI() {
      PrefSizePanel paintEg = new PrefSizePanel();

      JFrame frame = new JFrame("PrefSizePanel");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(paintEg);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

显示为


大多数Swing布局管理器尊重组件的首选大小,而不是其大小。您可以调用
setPreferredSize(新维度(500500))
,但这可能会在以后的代码中被覆盖,并导致GUI不灵活。最好重写JPanel的
getPreferredSize()
方法,并返回一个在所有情况下都最有效的计算维度

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.*;

public class PrefSizePanel extends JPanel {

   private static final int PREF_W = 500;
   private static final int PREF_H = PREF_W;

   public Dimension getPreferredSize() {
      // update as per Marco:
      if (super.isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   // just for fun
   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setPaint(new GradientPaint(0, 0, Color.red, 20, 20, Color.blue, true));
      g2.fillOval(0, 0, 2 * getWidth(), 2 * getHeight());
   }

   private static void createAndShowGUI() {
      PrefSizePanel paintEg = new PrefSizePanel();

      JFrame frame = new JFrame("PrefSizePanel");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(paintEg);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

显示为


覆盖
getPreferredSize
的提示相当频繁。但是,我认为在该方法的重写版本中,应该查询
isPreferredSizeSet
属性,因为否则,该方法将不会按照规范运行:当显式设置首选大小时,则应返回此首选大小,而不管组件“固有”如何首选尺寸。见@Marco13:谢谢你的信息和链接,1+。我已经相应地编辑了答案的示例代码。覆盖
getPreferredSize
的提示相当频繁。但是,我认为在该方法的重写版本中,应该查询
isPreferredSizeSet
属性,因为否则,该方法将不会按照规范运行:当显式设置首选大小时,则应返回此首选大小,而不管组件“固有”如何首选尺寸。见@Marco13:谢谢你的信息和链接,1+。我已经相应地编辑了答案的示例代码。