BorderLayout.CENTER并不是我的JPanel的中心

时间:2014-03-31 16:10:18

标签: java swing jpanel center

我有以下代码来创建我的GUI。

private static void createGUI() {
  JFrame frame = new JFrame ("Tiles Game");
  frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

  frame.setJMenuBar (new JMenuBar());
  frame.setContentPane (MainPanel.getInstance());

  frame.pack();
  frame.setResizable (false);
  frame.setLocationRelativeTo (null);
  frame.setVisible (true);
}

这是MainPanel(扩展JPanel)构造函数:

private MainPanel() {
  super (new BorderLayout());
  setPreferredSize (new Dimension (IMG_SIZE + 10, IMG_SIZE + 10));
  ...
  panel = new ImagePanel();
  add (panel, BorderLayout.CENTER);
}

这是ImagePanel(扩展JPanel)构造函数:

private ImagePanel() {
  super();
  setPreferredSize (new Dimension (IMG_SIZE, IMG_SIZE));
  ...
}

然而,ImagePanel与MainPanel的左上角对齐而不是居中,因此我在底部和右侧获得了一堆额外的填充,而在顶部和左侧没有任何填充。如何将其放在MainPanel的中心?

2 个答案:

答案 0 :(得分:2)

请勿使用JPanel显示图像。

而是使用JLabelImageIcon

如果你想在图像周围留出额外的空间,那么你可以在标签上使用EmptyBorder

答案 1 :(得分:2)

可能发生的事情是你正在从(0, 0)左上角绘制你的图像。然后将首选大小设置为大10像素,这会使面板变大,但图像仍处于(0, 0)

使用相同大小的witoout添加10,而只需使用EmptyBorder作为面板。另外,作为建议,请覆盖getPreferredSize(),而不是使用setPreferredSize()

public class ImagePanel extends JPanel {
    public ImagePanel() {
        setBorder(new EmptyBorder(10, 10, 10, 10));
    }

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

如果容器要大于子面板,您可能还需要考虑在容器面板上使用GridBagLayout作为确定的中心。你可以做的事很少。即使考虑使用ImageIconJLabel而不是绘画(如果图像不需要调整大小(如Camickr(+1)所指出的那样)。JLabel很容易只需设置标签的布局并将其设置为框架的内容窗格即可成为背景。

ImageIcon icon = new ImageIcon(...)
JLabel frameBackground = new JLabel(icon);
frameBackground.setLayout(new BorderLayout());
frame.setContentPane(frameBackground);