为什么这个JPanel实例没有正确调整大小?

时间:2014-09-18 06:59:16

标签: java swing jframe jpanel layout-manager

当我运行此代码时,我的Panel实例内部出现大约20 x 20像素而不是300,400我试图将其设置为。有人可以帮我找出原因吗?显然我对swing或java2D不是很有经验。感谢

编辑:我正在尝试以600,600尺寸显示电路板,并在内部显示尺寸为300,400的蓝色面板

//Application.java

import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.*;        //for Color

public class Application extends JFrame  {

  public Application()  {

    initUI();
  }

  private void initUI()  {
  //to put panels in here I have to write the class that defines them
  //such as Board. Theyll all extend JPanel and import it!

    Board brd = new Board();  
    setSize(600, 600);    
    setTitle("Application");

    Panels inner = new Panels(300, 400);
    brd.add(inner);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);           //Performed on JFrame
    getContentPane().add(brd);
  }

  public static void main (String[] args)  {

    EventQueue.invokeLater(new Runnable()  {
      @Override
      public void run()  {
        Application ex = new Application();
        ex.setVisible(true);

      }
    });
  } //end main()

}

//Board.java


import javax.swing.JPanel;

public class Board extends JPanel  {

  public Board()  {}

}  //end Board

//Panels.java

import javax.swing.JPanel;
import java.awt.*;

public class Panels extends JPanel  {

public int width;
public int height;

  public Panels(int w, int h)  {

    width = w;
    height = h;

    setSize(w, h);
    setBackground(Color.BLUE);
  }

  //methods
}

2 个答案:

答案 0 :(得分:2)

首先,您需要阅读并理解Laying Out Components Within a Container ...

您遇到的问题是Board默认使用FlowLayout。您可以将其布局管理器更改为BorderLayoutPanels将填充可用空间。

像素完美布局是现代ui设计中的幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正

如果要在布局管理器中影响组件的大小,则应覆盖getPreferredSize方法并返回所需的默认大小。

您应该在窗口上使用pack,因为这将打包内容窗口,以便内容区域满足布局管理器指定的要求

答案 1 :(得分:0)

我认为当Swing用于游戏或“有趣”的动画时,前提是......你在JPanel上绘制组件。不实例化大量的JPanel并移动它们。这是我误解的内容!