当前位置: 首页 > 知识库问答 >
问题:

如何防止JPanel继承其容器JFrame的大小

岳涵煦
2023-03-14

我创建了一个名为home WindowFrame的JFrame,并将其大小设置为(600,500),然后我向JFrame添加了一个名为main ContainerPanel的JPanel。我设置了一个新的大小,但它不工作。JPanel大小保持与JFrame相同,而不是更新。如何在JFrame中设置JPanels的大小。提前感谢。这里我的代码:

/***主窗口构造*/

    JFrame homeWindowFrame = new JFrame("Home - Crime File Management System");

    if (isInvalidLogin) {
        homeWindowFrame.setSize(600, 500);

    } else {
        homeWindowFrame.setSize(600, 400);
    }

    homeWindowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    homeWindowFrame.setLocation((screenSize.width / 2) - (homeWindowFrame.getWidth() / 2), (screenSize.height / 2) - (homeWindowFrame.getHeight() / 2));


    /**
     * Main panel construction
     */
    JPanel mainContainerPanel;

    if (isInvalidLogin) {
        mainContainerPanel = new JPanel(new GridLayout(4, 2));

    } else {
        mainContainerPanel = new JPanel(new GridLayout(3, 2));
    }

    homeWindowFrame.add(mainContainerPanel);

共有1个答案

慕冠宇
2023-03-14

您的代码似乎忽略了Java Swing布局管理器的工作方式。将JPanel添加到JFrame时,默认布局为BorderLayout,这将使面板在框架中居中,并调整其大小以填充框架。如果您希望有一个不同大小的面板,并且需要以某种方式设置它的preferredSize,那么容纳JPanel的容器将需要使用不同的布局管理器。例如,以“默认”方式使用的GridBagLayout(添加一个组件,没有GridBagConstraints)将使JPanel居中,如果这是您想要的。如果这些建议没有帮助,那么你应该创建一个自己的MCVE(请阅读链接)。

例如,我的MCVE:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class DiffSizedPanel extends JPanel {
    private static final int PANEL_W = 400;
    private static final int PANEL_H = 300;
    private static final int FRAME_W = 600;
    private static final int FRAME_H = 500;
    private static final Color BG_COLOR = Color.PINK;

    public DiffSizedPanel() {
        setBackground(BG_COLOR);

        // set the JPanel the preferred size desired
        setPreferredSize(new Dimension(PANEL_W, PANEL_H));
        setBorder(BorderFactory.createTitledBorder("This is the JPanel"));
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Different Sized Panel");

        // set the JFrame the preferred size desired
        frame.setPreferredSize(new Dimension(FRAME_W, FRAME_H));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // change the content pane's layout from default BorderLayout to GridBagLayout
        frame.getContentPane().setLayout(new GridBagLayout());
        frame.getContentPane().add(new DiffSizedPanel());  // add the JPanel
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
 类似资料:
  • 问题内容: 我的侧边栏中有一个使用嵌套列表( 和 标记)的分层导航菜单。我使用的预制主题已经具有列表项的样式,但是我想更改顶级项的样式,但不能将其应用于子项。是否有一种简单的方法可以将样式应用于顶级列表项标签,​​而无需将样式层叠到其子级列表项?我知道我可以在子项目中显式添加重写样式,但是如果有一种简单的方法,只是说“将这些样式应用于此类并且不要级联,我真的很想避免必须重复所有样式代码”他们将其归

  • 问题内容: 如果我们运行派生类,它将打印派生类和父类。是否有任何方法可以防止静态块的继承? // Class 1 // Class2 基本上我在父类中有一些方法要继承,但不希望实例化派生类时发生在父静态块中的处理。有没有办法做到这一点,否则我将不得不复制代码? 问题答案: 没有。 你不能这样做 。 静态的initialzier块不会被继承。 由于基类扩展了超类,因此在加载类时将执行静态块,即使超类

  • 我有几个配置文件,比如: application.yaml 我想我需要一些定制属性spring Binder.class定制,但我找不到任何解决方案。 提前感谢!

  • 使用Java,我用GridBagLayout创建一个表单。GUI在一个J面板中,它在一个添加到JFrame的scrollPane中。 我希望带有GUI的JPanel的大小是固定的,以防止表单被拉伸,但是,我希望JScrollPanel可以根据用户的喜好调整大小。(类似于MS Paint,画布是我的JPanel)。我想要防止表单被拉伸的原因是因为我希望它能够打印,并且从我现在的方式来看,打印的表单几

  • 问题内容: 我正在寻找一种奇妙的方式来防止闭合继承周围的scrope。例如: 我知道只有 两种方法可以 防止共享范围: (1)使用阴影变量: (2)将函数体放在其他位置: 我的问题是-有人知道防止闭包继承JS范围的第三种方法吗?花哨的东西很好。 我认为唯一可行的方法是在Node.js中。 让我们利用想象力来思考一下,并假设JS有一个private关键字,这意味着变量仅在该函数的作用域内是私有的,如

  • 问题内容: 我有一个派生许多子进程的服务器进程。服务器进程与CPU核心具有关联性,但我不希望该关联性由子进程继承(而是OS应该处理在何处运行这些进程)。有没有办法针对cpu亲和力取消父子进程的链接? 问题答案: 您可以在和之后使用CPU掩码中设置的所有位进行调用。