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

5
我有一个基于Swing的JPanel的自定义GUI组件。该组件放置在使用BorderLayout的JFrame中。当我调整窗口大小时,该组件会随之调整大小。我应该怎么做才能避免这种情况?我希望无论发生什么情况,该组件都保持相同的大小。我已经尝试使用setSize、setPreferredSize和setMinimumSize,但都没有成功。
提前感谢!
M

2
在许多布局中,您将失去对大小的控制权,由布局管理器负责。 - MByD
1
我希望组件无论发生什么都保持相同的大小。嗯,您是否将JPanel添加到JScrollPane以获取MinimumSize? - mKorbel
3个回答

6
你有几个选择:
  • 将组件嵌套在一个内部面板中,并使用一个不调整你的组件大小的LayoutManager

  • 使用比BorderLayout更复杂的LayoutManager。我认为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);
    }
}

结果:

enter image description here

绿色组件位于BorderLayout.CENTER,红色组件保持首选大小。


是的,正如你所说,最好寻找另一个可以接受最小/最大尺寸的LayoutManager,使用SetSize是错误的示例,请删除你的添加代码。 - mKorbel
1
@小兔子Foo Foo,没问题。顺便说一下,10k+的用户可以看到已删除的帖子,所以您可以在删除评论之前将其放在自己的答案下面。 - aioobe

0
//this will restrict size on fix size, what ever size you will define for panel like
//panel.setSize(400,400);


    panel.setMaximumSize(panel.getSize());
    panel..setMinimumSize(panel.getSize());

3
引用一下原文:"That won't work if the component in question is put in BorderLayout.CENTER for instance. The component will be resized regardless of those values." 这段话的意思是,如果涉及到的组件被放置在BorderLayout.CENTER位置,那么这种方法就行不通了。因为无论设置什么值,该组件都会被调整大小。 - mre
哦,我现在明白了,我更喜欢不直接使用或添加组件到边框布局中心,而是尝试创建一个新的JPanel,使用任何其他布局,如FlowLayout,暂时将该组件添加到新创建的FlowLayout中,并将这个新创建的面板添加到边框布局面板的中心,它不会调整边框布局面板内部的组件大小。 - Abdul

0

如果您正在使用自定义布局管理器,请将当前布局更改为GridBagLayout,并将填充选项更改为NONE,然后将其改回到您的第一个布局。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接