Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BorderLayout.CENTER不';t居中我的JPanel_Java_Swing_Jpanel_Center - Fatal编程技术网

Java BorderLayout.CENTER不';t居中我的JPanel

Java BorderLayout.CENTER不';t居中我的JPanel,java,swing,jpanel,center,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.pa

我有以下代码来创建我的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);
}
这是主面板(扩展JPanel)构造函数:

private MainPanel() {
  super (new BorderLayout());
  setPreferredSize (new Dimension (IMG_SIZE + 10, IMG_SIZE + 10));
  ...
  panel = new ImagePanel();
  add (panel, BorderLayout.CENTER);
}
private ImagePanel() {
  super();
  setPreferredSize (new Dimension (IMG_SIZE, IMG_SIZE));
  ...
}
这是ImagePanel(扩展JPanel)构造函数:

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

但是,ImagePanel与主面板的左上角对齐,而不是居中,因此在底部和右侧有一堆额外的填充,而在顶部和左侧没有。如何将其放置在主面板的中心?

不要使用JPanel显示图像

使用带有图像图标的
JLabel


如果您希望图像周围有额外的空间,则可以在标签上使用
清空顺序。

不要使用JPanel显示图像

使用带有图像图标的
JLabel


如果您想在图像周围留出更多空间,则可以在标签上使用
清空顺序。

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

相反,使用相同的尺寸,不加10,只需为面板使用
EmptyBorder
。另外,建议重写
getPreferredSize()
,而不是使用
setPreferredSize()

您也可以考虑使用“<代码> GridBagLayout <代码>容器容器,对于一个确定的中心,如果容器大于子面板。你能做的事很少。甚至可以考虑使用<代码> IMAGE图标< /C>和<代码> jLabor <代码>来代替绘画(如果图像不需要调整大小(如Camickr(+ 1)所指出的那样)。一个<代码> jLabor <代码>可以很容易地通过设置标签的布局并将其设置为框架的内容窗格来创建背景。

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

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

相反,在不添加10的情况下使用相同的大小,并且只为面板使用
EmptyBorder
。另外,作为建议,替代
getPreferredSize()
而不是使用
setPreferredSize()

您也可以考虑使用“<代码> GridBagLayout <代码>容器容器,如果容器大于子面板,您可以做的事情很少。甚至考虑使用<代码> IMAGICONION<代码>和<代码> jLabel <代码>代替绘画(如果图像不需要调整大小(如Camickr(+ 1))。只需设置标签的布局并将其设置为框架的内容窗格,即可轻松将

JLabel
设置为背景

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

它可能是您的图像。图像大小固定,如果设置为0,0坐标,则每次调整JFrame的大小时,都会显示面板未居中。如果对齐有问题,并且不确定是哪个组件引起,请尝试为组件设置一些可见边框。例如,将
this.setBorder(new EtchedBorder())
在您的
主面板
构造函数中。然后,您将看到初始化时所采用的边界。至于您的代码,我认为布局没有问题-一定是其他问题。可能是您的图像。图像大小固定,如果设置为0,0坐标,每次调整JFrame的大小时,您的面板看起来都不是中心红色。如果对齐有问题,并且不确定是哪个组件引起的,请尝试为组件设置一些可见边框。例如,put
this.setboorder(new EtchedBorder())
在您的
主面板中
构造函数。然后,您将看到初始化时所采用的边界。至于您的代码,我认为布局没有问题-一定是其他问题。因此,问题在于BorderLayout不尊重首选大小(甚至最大大小)并调整了ImagePanel的大小以适应主面板。使用GridBagLayout可以正确地将ImagePanel居中。所以问题是BorderLayout不考虑首选大小(甚至最大大小)并且刚刚调整了ImagePanel的大小以适应主面板。使用GridBagLayout正确居中我的ImagePanel。我不能使用ImageIcon,因为我也在那里做一些图像处理。使用JLabel而不是JPanel有什么特别的原因吗?我不能使用ImageIcon,因为我也在那里做一些图像处理。使用JLab有什么特别的原因吗艾尔对杰帕内尔?