如何在JFrame中正确居中JPanel(FIXED SIZE)?
大家好! 我正试图解决一个 – 一个简单的问题,但我无法解决它。 我正在使用Java / Swing库开发示例应用程序; 我有一个JFrame和一个JPanel。 我只想达到以下目标:
-
JPanel 必须在JFrame内部居中。
-
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)
代替?