为啥我的 JButton 显示为 JFrame 的全尺寸?
Posted
技术标签:
【中文标题】为啥我的 JButton 显示为 JFrame 的全尺寸?【英文标题】:Why does my JButton appear the full size of the JFrame?为什么我的 JButton 显示为 JFrame 的全尺寸? 【发布时间】:2014-03-01 21:52:19 【问题描述】:我是新手,我有一个问题。我正在尝试使用 Eclipse 编写一个 Java windows 应用程序,其中我将有一个主窗口,其中将包含几个东西,比如仪表板之类的东西,它会有按钮,例如将记录添加到数据库,并且按下此按钮时,将在顶部打开一个新的相关窗口。
我试着开始,我用 Java 写了这段代码,由于某种原因,按钮的大小是框架的大小......全屏!我该如何解决?
你能建议我比我指定的更好的设计想法吗?
谢谢
public class MainClass
public static void main(String[] args)
// TODO Auto-generated method stub
JFrame jfrm = new JFrame("Frame1");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
jfrm.setSize(screenSize.width, screenSize.height);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel jlab = new JLabel("Hello");
jfrm.add(jlab);
JButton button = new JButton("Button");
button.setSize(new Dimension(50, 50));
button.setLocation(500, 350);
jfrm.getContentPane().add(button);
jfrm.setVisible(true);
【问题讨论】:
【参考方案1】:首先将布局添加到 JFrame。例如FlowLayout
:
jfrm.setLayout(new FlowLayout());
【讨论】:
【参考方案2】:“我试着开始,我用Java写了这段代码,由于某种原因,按钮是框架的大小......全屏!我该如何解决它?”
按钮伸展的原因是因为JFrame
有一个默认的BorderLayout
,它不尊重子组件的首选大小。
解决方案是将布局管理器设置为确实尊重首选尺寸的布局。来自this example 的图片展示了最常见的布局管理器,并直观地显示了哪一个尊重子组件的首选大小。
另外,BorderLayout
也是您的JLabel
未显示的原因。默认情况下,添加到 BorderLayout
的每个组件都没有指定位置,例如BorderLayout.SOUTH
,将自动置于BorderLayout.CENTER
位置。每个职位可能只有一个组件。因此,当您添加JLabel
时,它会转到CENTER
,但是当您添加JButton
时,它也会转到CENTER
,踢出JLabel
。
如果您从未遇到过布局管理器,这可能会让您感到困惑。你应该花时间去看看How to Layout Components Within a Container
【讨论】:
【参考方案3】:你需要使用某种形式的布局管理器,你可以使用这个信息:http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
【讨论】:
【参考方案4】:您必须使用Layout manager。
使用此代码..
public static void main(String[] args)
JFrame jfrm = new JFrame("Frame1");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
jfrm.setSize(screenSize.width, screenSize.height);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel jlab = new JLabel("Hello");
jfrm.add(jlab);
JButton button = new JButton("Button");
button.setSize(new Dimension(50, 50));
button.setLocation(500, 350);
jfrm.add(button);
jfrm.setVisible(true);
jfrm.setLayout(new FlowLayout());
jfrm.pack();
您忘记添加pack()
。所以使用这段代码来并排获取 Jlabel 和 JButtion。
谢谢...
【讨论】:
以上是关于为啥我的 JButton 显示为 JFrame 的全尺寸?的主要内容,如果未能解决你的问题,请参考以下文章
为什么我的JButton在放入JPanel的构造函数时不显示?