【问题标题】:JFrame very small using null layout使用空布局的 JFrame 非常小
【发布时间】:2017-08-12 04:35:52
【问题描述】:

嗨,我正在编写一个简单的程序来显示一个框架。 但是,当我键入 setLayout(null); 时,框架变得非常小; 但是如果我忽略这个命令,按钮总是在顶部中心 有人能指出我的错误吗?

import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

class theframe {

    private static void create() {
        JFrame frame = new JFrame("FrameDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Insets insets = frame.getInsets();
        frame.setSize(500 + insets.left + insets.right, 350 + insets.top + insets.bottom);
        add(frame.getContentPane()); //my function add
        frame.pack();
        frame.setVisible(true);
    }

    public static void add(Container pane) {
        pane.setLayout(null);
        Insets insets = pane.getInsets();

        JPanel p1 = new JPanel();
        p1.setPreferredSize(new Dimension(500, 350));

        JButton b1 = new JButton("one");
        Dimension size = b1.getPreferredSize();
        b1.setBounds(25 + insets.left, 5 + insets.top, size.width, size.height);

        pane.add(p1);
        p1.add(b1);
    }

    public static void main(String Args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                create();
            }
        });
    }
}

【问题讨论】:

  • 规则似乎是“没有 LayoutManager 就没有 UI”。
  • 打包后尝试设置JFrame的大小。否则 pack() 将重置您的尺寸。
  • 对不起,我不明白。我正在从 oracle 教程中学习,并且正在使用 null 布局我不知道为什么它会发生在我的运行中
  • @UwePlonus 是的,但按钮和面板不再可见
  • 提供 GUI 的 ASCII 艺术,因为它应该以最小尺寸显示,并且(如果可调整大小)具有额外的宽度/高度。

标签: java swing jframe jpanel


【解决方案1】:

如果您看到 pack() 函数,它不在 JFrame.java 中,而是在 Window.java 中

public void pack() {
    Container parent = this.parent;
    if (parent != null && parent.getPeer() == null) {
        parent.addNotify();
    }
    if (peer == null) {
        addNotify();
    }
    Dimension newSize = getPreferredSize();
    if (peer != null) {
        setClientSize(newSize.width, newSize.height);
    }

    if(beforeFirstShow) {
        isPacked = true;
    }

    validateUnconditionally();
}

现在,如果您在 Container.java 中看到 getPreferredSize() 函数

@Deprecated
public Dimension preferredSize() {
    /* Avoid grabbing the lock if a reasonable cached size value
     * is available.
     */
    Dimension dim = prefSize;
    if (dim == null || !(isPreferredSizeSet() || isValid())) {
        synchronized (getTreeLock()) {
            prefSize = (layoutMgr != null) ?
                layoutMgr.preferredLayoutSize(this) :
                super.preferredSize();
            dim = prefSize;
        }
    }
    if (dim != null){
        return new Dimension(dim);
    }
    else{
        return dim;
    }
}

一切都归结为layoutMgr.preferredLayoutSize(this); 由于您没有设置布局(或 null),因此您遇到了这个问题。删除该语句或使用某种布局。

【讨论】:

  • 我只是说一切都归结为设置布局。如果 OP 想要浏览代码,突出显示只是为了提供信息。我在这里没有看到任何废话。
  • 很公平,我读的太少了,太快了,误以为你在暗示 pack() 不是一种可用于框架的方法。我的错。 :P ..还有一个迟来的 +1 :)
  • 发生...不用担心 :)
  • 我也 +1 :)
【解决方案2】:

您正在使用绝对定位(null 布局)调用 pack() 方法,您应该使用 LayoutManager 而不是将布局设置为 null

只需删除这一行:

pane.setLayout(null);

注意:听我的建议,自学LayoutManagers,因为如果你拒绝学习,你可能会去null布局,是的,这更容易但强烈建议不要使用它。

你必须知道的一些基本知识:

  1. JFrame 的默认布局是 BorderLayout,只有五个位置可以放置组件,如链接所示。
  2. FlowLayout 是每个 JPanel 的默认布局管理器。它只是将组件布置在一行中,如果其容器不够宽,则开始一个新行。

毕竟,在开始使用 swing 之前,请阅读更多关于 LayoutManagers 的信息,相信我,它会让你的工作变得更轻松,试试吧,太棒了。

【讨论】:

  • 是的,但是按钮总是在顶部居中,我无法在面板上设置它的位置
  • @Azdad 使用pane.setPreferredSize(someDimension); 将解决问题,您不需要使用布局管理器。最好在创建GUI应用的时候使用它,但是null布局不是这里的问题。
  • “我无法设置它在面板上的位置”不应该设置组件的位置。
  • @AndrewThompson 为什么不呢?布局管理器是不是有点复杂?
  • “为什么不呢?” 因为我在 7 分钟前发表了评论。 “布局管理器是不是有点复杂?” 比自己弄清楚组件的位置要简单(出于相同的原因)。
【解决方案3】:

Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。

要为强大的 GUI 组织组件,请改用布局管理器或它们的组合,以及用于空白的布局填充和边框。

请参阅this answer,了解如何:

  1. 组合布局。
  2. 使用布局构造函数参数和边框提供空白。

【讨论】:

    【解决方案4】:

    幸运的是,我遇到了同样的问题,我用一行代码解决了。希望这也有助于您尝试遵循以下步骤:

    1- 转到您的文件代码中

    2- 在代码开头找到这一行:

                initComponents();
    

    3- 只需在这一行之后添加这个新代码:

    this.setMinimumSize(new Dimension(300, 300));
    

    此处的关键字“this”代表您当前的顶级组件,因此此处应用了 (300, 300) 等新维度。您可以根据所需的框架/组件大小更改这 300 个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 2015-12-03
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      相关资源
      最近更新 更多