如何防止LayoutManager过度缩小组件?

时间:2011-08-25 22:55:50

标签: java swing layout awt border-layout

如何防止GUI组件在BorderLayout Manager中调整大小时缩小?是否可以设置最小尺寸,以便组件不会超出它?似乎使用setBounds不能与布局管理器一起使用。

还有一个问题:如果我使用嵌套面板,是否可以为它们分配固定位置并让布局管理器处理这些面板内的组件?我正试图阻止GUI组件移动。

5 个答案:

答案 0 :(得分:5)

不幸的是,布局管理器是否遵循最小尺寸,最大尺寸等取决于布局管理器实现。这会导致很多令人困惑的行为,因为并非所有布局管理员都会尊重它们,而BorderLayout并不尊重这些约束。

BoxLayout将尊重这些价值观。 JComponent.setBounds是LayoutManager用于设置子节点的内容,因此您的布局管理器可能会覆盖您放在那里的任何内容。如果你试图限制一些东西可以得到什么我建议你在你的JFrame或JDialog上设置一个最小尺寸然后阻止某人太小,导致布局管理员做有趣的事情。

我对Swing的任何人的第一个建议是抓住TableLayout,花15分钟学习它,你的大部分布局问题都可以解决。我不知道这是否适用于您正在做的事情,但是在您遇到需要它的布局问题之前不久。 TableLayout允许您指定增长或缩小的内容,如果窗口太小而无法显示,则不会将它们调整为小于首选大小。

https://www.oracle.com/technetwork/java/tablelayout-141489.html

我不确定你想做什么来提供更好的建议。

答案 1 :(得分:2)

  

如何防止GUI组件在BorderLayout Manager中调整大小时缩小?是否可以设置最小尺寸,以使组件不会超出它?

我的问题应该是按照我的意愿为大多数LayoutManagers设置MaximumSize,但Minimum & PreferredSize按预期工作,只是基本示例

BorderLayout奠定,期待中心区域

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

public class CustomComponent extends JFrame {

    private static final long serialVersionUID = 1L;

    public CustomComponent() {
        setTitle("Custom Component Test / BorderLayout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void display() {
        add(new CustomComponents(), BorderLayout.NORTH);
        add(new CustomComponents(), BorderLayout.CENTER);
        add(new CustomComponents(), BorderLayout.SOUTH);
        add(new CustomComponents(), BorderLayout.EAST);
        pack();
        // enforces the minimum size of both frame and component
        setMinimumSize(getMinimumSize());
        setPreferredSize(getPreferredSize());
        setVisible(true);
    }

    public static void main(String[] args) {
        CustomComponent main = new CustomComponent();
        main.display();
    }
}

class CustomComponents extends JLabel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(200, 100);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 200);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}

GridLayout

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

public class CustomComponent1 extends JFrame {

    private static final long serialVersionUID = 1L;

    public CustomComponent1() {
        setTitle("Custom Component Test / GridLayout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void display() {
        setLayout(new GridLayout(0, 1));
        add(new CustomComponents());
        add(new CustomComponents());
        add(new CustomComponents());
        add(new CustomComponents());
        pack();
        // enforces the minimum size of both frame and component
        setMinimumSize(getMinimumSize());
        setPreferredSize(getPreferredSize());
        setVisible(true);
    }

    public static void main(String[] args) {
        CustomComponent1 main = new CustomComponent1();
        main.display();
    }
}

class CustomComponents extends JLabel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(200, 100);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 200);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}

Just one more question: If I used nested panels, is it possible to assign 
them fixed positions and let the layout manager takes care of the components 
inside these panels?

是的,对于大多数完整的GUI,我看不出任何问题,问题应该只是将几个JComponent正确地布局到GUI中,但为此你必须提出真正的问题

答案 2 :(得分:1)

您可以使用setMinimumSizesetMaximumSizesetPreferredSize来控制组件的大小(尽管如果某些布局管理器与布局管理器的要求发生冲突,它们必然会忽略它们)。

使用布局管理器时不应使用setBounds,因为setBounds是布局管理器调整组件大小的机制,因此您设置的任何边界都将被覆盖。布局经理。

答案 3 :(得分:0)

也许你可以试试MigLyout。这是非常好的布局管理员。

答案 4 :(得分:0)

我正在寻找类似问题的解决方案,我在这里找到了非常有趣的文档(它解决了我的问题):http://javadude.com/articles/layouts/#blHow

实际上,您只需要在使用BorderLayout时设置组件的preferedSize(有关详细信息,请参阅链接)

例如

JFrame jframe = new JFrame("test Borderlayout");
jframe.setLayout(new BorderLayout());

JButton button1 = new JButton("1");
JButton button2 = new JButton("2");
button2.setPreferredSize(new Dimension(200,0));

jframe.add(button1,BorderLayout.CENTER);
jframe.add(button2, BorderLayout.EAST);

jframe.setSize(300, 100);
jframe.setVisible(true);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

在上面的示例中,即使调整大小,button2也不会缩小(将宽度保持为200像素)。

结果

enter image description here

结果已调整大小

enter image description here