如何在JFrame中正确居中JPanel(FIXED SIZE)?

大家好! 我正试图解决一个 – 一个简单的问题,但我无法解决它。 我正在使用Java / Swing库开发示例应用程序; 我有一个JFrame和一个JPanel。 我只想达到以下目标:

  1. JPanel 必须在JFrame内部居中。

  2. JPanel 必须 始终具有指定的大小
    setPreferredSize()方法。 它不能在这个尺寸下resize。

我尝试使用GridBagLayout:这是我能做到的唯一方式。

请参阅以下示例:

/* file StackSample01.java */ import java.awt.*; import javax.swing.*; public class StackSample01 { public static void main(String [] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension(100, 100)); panel.setBackground(Color.RED); frame.setLayout(new GridBagLayout()); frame.add(panel, new GridBagConstraints()); frame.setSize(new Dimension(200, 200)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 

这是一个截图:

我不会使用GridBagLayout做一件太简单的事情。 我尝试了一个最简单的解决方案,使用Box,但这不起作用:

示例代码:

 /* file StackSample02.java */ import java.awt.*; import javax.swing.*; public class StackSample02 { public static void main(String [] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension(100, 100)); panel.setBackground(Color.RED); // for debug panel.setAlignmentX(JComponent.CENTER_ALIGNMENT); // have no effect Box box = new Box(BoxLayout.Y_AXIS); box.add(Box.createVerticalGlue()); box.add(panel); box.add(Box.createVerticalGlue()); // causes a deformation frame.add(box); frame.setSize(new Dimension(200, 200)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 

这是一个截图,

有任何想法吗? 谢谢大家 :-)

BoxLayout可以很好地保存你的setXxxSize(),然后只需添加panel.setMaximumSize(new Dimension(100, 100));

你的输出就是

由setMinimumSize删除如果Container的大小更大,则注意…)

在此处输入图像描述在此处输入图像描述在此处输入图像描述

 import java.awt.*; import javax.swing.*; public class CustomComponent12 extends JFrame { private static final long serialVersionUID = 1L; public CustomComponent12() { Box box = new Box(BoxLayout.Y_AXIS); box.setAlignmentX(JComponent.CENTER_ALIGNMENT); box.add(Box.createVerticalGlue()); box.add(new CustomComponents12()); box.add(Box.createVerticalGlue()); add(box); pack(); setTitle("Custom Component Test / BoxLayout"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setMaximumSize(getMinimumSize()); setMinimumSize(getMinimumSize()); setPreferredSize(getPreferredSize()); setLocation(150, 150); setVisible(true); } public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { CustomComponent12 main = new CustomComponent12(); } }; javax.swing.SwingUtilities.invokeLater(r); } } class CustomComponents12 extends JPanel { private static final long serialVersionUID = 1L; @Override public Dimension getMinimumSize() { return new Dimension(100, 100); } @Override public Dimension getMaximumSize() { return new Dimension(100, 100); } @Override public Dimension getPreferredSize() { return new Dimension(100, 100); } @Override public void paintComponent(Graphics g) { int margin = 10; Dimension dim = getSize(); super.paintComponent(g); g.setColor(Color.red); g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); } } 

首先,感谢大家。

我又回答了自己的问题,向大家展示了我的选择。 请参阅下面的示例代码; 如您所见,我只包含了实现目标绝对必要的最小步骤。

 /* file StackResponse.java */ import java.awt.*; import javax.swing.*; public class StackResponse { public static void main(String [] args) { JPanel panel = new JPanel(); Dimension expectedDimension = new Dimension(100, 100); panel.setPreferredSize(expectedDimension); panel.setMaximumSize(expectedDimension); panel.setMinimumSize(expectedDimension); panel.setBackground(Color.RED); // for debug only Box box = new Box(BoxLayout.Y_AXIS); box.add(Box.createVerticalGlue()); box.add(panel); box.add(Box.createVerticalGlue()); JFrame frame = new JFrame(); frame.add(box); frame.setSize(new Dimension(200, 200)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setMinimumSize(frame.getMinimumSize()); // cannot be resized- frame.setVisible(true); } } 

在这里你可以看到截图。

问题解决了。 非常感谢所有人。

使用GridBagLayout创建一个名为“FixedPanel”的面板,并将首选大小设置为帧大小,然后将您的帧添加到FixedPanel中。

 Frame = new JFrame("CenterFrame"); Frame.setLocation(0, 0); Frame.setSize(new Dimension(400,400));//dim JPanel FixedPanel = new JPanel(new GridBagLayout()); FixedPanel.setPreferredSize(Frame.getSize()); JPanel myPanel = new JPanel(); myPanel.setPreferredSize(new Dimension(100,100)); myPanel.setBackground(Color.BLACK); FixedPanel.add(myPanel); Frame.add(FixedPanel); Frame.setVisible(true); 

你可以这样做。 我不得不做一个国际象棋比赛,我希望棋子片总是进入一个JlayeredPane的细胞中心:

 private void formMouseReleased(java.awt.event.MouseEvent evt) { // TODO add your handling code here: if (jl != null) { jl.setLocation(evt.getX()+10, evt.getY()+10); Component com = findComponentAt(evt.getPoint()); if (com instanceof JPanel) { // System.out.println("Yes, it's a jpanel"); ((JPanel)com).add(jl); ((JPanel)com).validate(); } } } 

它刚刚拥有

jPanel.setBounds(x,y,1046,503);

其中x是右侧的空间,y是左侧的空间。 你必须根据屏幕的高度和宽度计算两侧的空间

使用

 panel.setMaximumSize(new Dimension(200,200)); panel.setResizable(false) 

代替?