Java Swing组件-禁用在布局中调整大小

Java Swing组件-禁用在布局中调整大小,java,swing,user-interface,layout,resize,Java,Swing,User Interface,Layout,Resize,我有一个定制的GUI组件,它基于Swing的JPanel。此组件放置在使用BorderLayout的JFrame中。当我调整框架的大小时,该组件会不断调整大小。我怎样才能避免这种情况?无论发生什么情况,我都希望组件保持相同的大小。我尝试过setSize、setPreferredSize、setMinimumSize,但没有成功 提前谢谢 M您有几个选择: 使用不会调整组件大小的LayoutManager将组件嵌套在内部面板中 使用比BorderLayout更复杂的布局管理器。在我看来,Grid

我有一个定制的GUI组件,它基于Swing的JPanel。此组件放置在使用BorderLayout的JFrame中。当我调整框架的大小时,该组件会不断调整大小。我怎样才能避免这种情况?无论发生什么情况,我都希望组件保持相同的大小。我尝试过setSize、setPreferredSize、setMinimumSize,但没有成功

提前谢谢


M

您有几个选择:

  • 使用不会调整组件大小的
    LayoutManager
    将组件嵌套在内部面板中

  • 使用比
    BorderLayout
    更复杂的布局管理器。在我看来,
    GridBagLayout
    更适合您的需要

第一个解决方案的示例:

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

public class FrameTestBase extends JFrame {

    public static void main(String args[]) {
        FrameTestBase t = new FrameTestBase();

        JPanel mainPanel = new JPanel(new BorderLayout());

        // Create some component
        JLabel l = new JLabel("hello world");
        l.setOpaque(true);
        l.setBackground(Color.RED);

        JPanel extraPanel = new JPanel(new FlowLayout());
        l.setPreferredSize(new Dimension(100, 100));
        extraPanel.setBackground(Color.GREEN);

        // Instead of adding l to the mainPanel (BorderLayout),
        // add it to the extra panel
        extraPanel.add(l);

        // Now add the extra panel instead of l
        mainPanel.add(extraPanel, BorderLayout.CENTER);

        t.setContentPane(mainPanel);

        t.setDefaultCloseOperation(EXIT_ON_CLOSE);
        t.setSize(400, 200);
        t.setVisible(true);
    }
}
结果:

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

public class FrameTestBase extends JFrame {

    public static void main(String args[]) {
        FrameTestBase t = new FrameTestBase();

        JPanel mainPanel = new JPanel(new BorderLayout());

        // Create some component
        JLabel l = new JLabel("hello world");
        l.setOpaque(true);
        l.setBackground(Color.RED);

        JPanel extraPanel = new JPanel(new FlowLayout());
        l.setPreferredSize(new Dimension(100, 100));
        extraPanel.setBackground(Color.GREEN);

        // Instead of adding l to the mainPanel (BorderLayout),
        // add it to the extra panel
        extraPanel.add(l);

        // Now add the extra panel instead of l
        mainPanel.add(extraPanel, BorderLayout.CENTER);

        t.setContentPane(mainPanel);

        t.setDefaultCloseOperation(EXIT_ON_CLOSE);
        t.setSize(400, 200);
        t.setVisible(true);
    }
}


绿色组件放置在
BorderLayout中。中间
,红色组件保持首选大小。

如果使用自定义布局管理器,请将当前布局更改为GridBagLayout,并将填充选项更改为无,之后,将其更改回第一个布局。

在许多布局上,布局管理器无法控制其大小。“无论发生什么情况,我都希望组件保持相同的大小”hmmm是您将JPanel添加到JScrollPane以获得最小的大小,我引用,“例如,如果正在讨论的组件放在BorderLayout.CENTER中,那么这将不起作用。无论这些值如何,组件都将调整大小。“:)哦,我现在明白了,我不想直接使用或将组件添加到border layout center,但现在尝试使用任何其他布局(如flowlayout)创建新的JPanel,将该组件添加到新创建的flowlayout中,并将新创建的面板添加到border layout面板的中心,它不会在borderlayout面板内调整组件的大小。是的,正如您所说,最好是寻找另一个接受最小/最大大小的LayoutManager,使用SetSize确实是错误的示例,请删除您的添加code@little小兔子,没问题。作为记录,10k+用户可以看到已删除的帖子,因此您可以在删除之前将此评论放在您自己的答案下面。