【问题标题】:Swing Component - disabling resize in layoutSwing 组件 - 在布局中禁用调整大小
【发布时间】:2011-09-23 11:34:17
【问题描述】:

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

提前致谢!

M

【问题讨论】:

  • 在许多布局中,布局管理器会失去对大小的控制。
  • “无论发生什么,我都希望组件保持相同的大小”嗯,您是否将 JPanel 添加到 JScrollPane 以获取 MinimumSize

标签: java swing user-interface layout resize


【解决方案1】:

你有几个选择:

  • 使用LayoutManager 将组件嵌套在内部面板中,该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);
    }
}

结果:

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

【讨论】:

  • 是的,正如你所说的更好的是寻找另一个接受 Min/Max Size 的 LayoutManager,使用 SetSize 的例子确实是错误的,请删除你的添加代码
  • @little bunny foo foo,没问题。作为记录,10k+ 用户可以看到已删除的帖子,因此您可以在删除之前将此评论放在您自己的答案下方。
【解决方案2】:
//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());

【讨论】:

  • 我引用,“例如,如果将相关组件放在 BorderLayout.CENTER 中,这将不起作用。无论这些值如何,组件都将调整大小。” :)
  • 哦我现在明白了,我更喜欢不要直接使用或添加组件到边框布局中心但是,现在尝试使用任何其他布局(如 flowlayout)创建新的 JPanel,并将该组件添加到新的创建了flowlayout并将这个新创建的面板添加到borderlayout面板的中心,它不会调整borderlayout面板内的组件大小。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多