Java 如何在JFrame中正确地将JPanel(固定大小)居中?
大家好! 我试图解决一个看似简单的问题,但我无法解决它。 我正在使用Java/Swing库开发一个示例应用程序; 我有一个JFrame和一个JPanel。 我只想实现以下目标:Java 如何在JFrame中正确地将JPanel(固定大小)居中?,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,大家好! 我试图解决一个看似简单的问题,但我无法解决它。 我正在使用Java/Swing库开发一个示例应用程序; 我有一个JFrame和一个JPanel。 我只想实现以下目标: JPanel必须在JFrame内居中 JPanel必须始终具有指定的大小 setPreferredSize()方法。不得在此大小下调整其大小 我尝试使用GridBagLayout:这是我唯一能做到的方法 请参见下面的示例: /* file StackSample01.java */ import java.awt.*;
setPreferredSize()方法。不得在此大小下调整其大小
/* 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做太简单的事情。
我尝试了一个最简单的解决方案,使用了一个盒子,但这不起作用:
示例代码:
/* 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);
}
}
截图
有什么想法吗?感谢所有:-)使用
panel.setMaximumSize(new Dimension(200,200));
panel.setResizable(false)
相反?可以保存setXxxSize(),然后只需添加panel.setMaximumSize(新维度(100100))代码>
您的输出将是
由setMinimumSize删除(注意,如果容器的大小大于…)
首先,感谢大家
我再次回答自己的问题,向大家展示我所做的选择。
参见下面的示例代码;
正如你所看到的,我只包括了实现目标绝对必要的最小步骤
/* 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);
}
}
你可以看到一个截图
问题解决了。
再次感谢大家
你可以这样做。我必须下一盘棋,我想让棋子一直放在一个格子的中央,那是一个窗格:
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,1046503)
其中x为右侧空间,y为左侧空间。
您必须根据屏幕高度和宽度计算两侧的空间使用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);
您是否尝试过使用BorderFactory类在“panel”周围放置边框?我对它不太熟悉,否则我会给出一个更具体的例子。“我不会用GridBagLayout做一件太简单的事情。”为什么不呢?我非常讨厌GBL,但在这种情况下,这将是我尝试的第一个布局。@Andrew-full ack,除了使用GBL,永远不会使用它:-)而是选择三大表单之一,Mig,Design,无论什么是个人最喜欢的。@kleopatra you否决了使用setXxxSize()的答案,您是否愿意为我们提供一个正确的答案或一个正确答案的链接?我已经厌倦了阅读你的“-1”作为这个,-1作为那个”评论。@mostruash提示:有一个“频繁”标签。。老实说,我已经厌倦了开发人员不做太多的工作来找到他们问题的答案,或者投票给答案的原因(上升和下降都没有什么区别)-毕竟,找到东西是他们工作的本质。JPanel没有SetResizeable(布尔Resizeable)方法-1对于setXXSize和发明api-你知道如果你不知道,没有义务回答吗?胡乱猜测——这绝对是错误的。@kleopatra有人可以从我的字里行间读到:-),我的好奇心(我们只讨论最深的JC组件,没有孩子)怎么样,或者如果可能的话,resurns可以用另一种方式来设置XXX
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);