为啥我的 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的构造函数时不显示?

当JButton按下时isShiftDown?

如何通过单击 JButton 添加 JPanel?

在另一个 JFrame 中使用 JButton 刷新 JTable?

如何在JFrame中展示一个网页?

Java运行其他类的main方法,当JButton被按下时