【问题标题】:How to make large components not to blow up the layout when using JGoodies FormLayout?使用JGoodies FormLayout时如何让大组件不炸毁布局?
【发布时间】:2014-08-17 08:19:49
【问题描述】:

我正在使用 JGoodies Forms 1.8.0

当单个超大标签导致整个布局不再适合窗口时,我遇到了问题。我希望在视觉上修剪该文本,因此对于用户来说很明显文本不适合,但 GUI 的其余部分仍应保持适合。

我准备了一个展示相同行为的简化示例。这里一切正常,因为窗口足够大:

这里是同一个窗口,但调整了大小:

请注意,最右边的列不再可见。

想要的效果如下:

  • 如果文本适合,则应完整显示

  • 如果文本不合适,则应将其末尾剪掉

  • 文本应左对齐

  • 所有按钮都应该始终可见

  • 按钮 100 应该在窗口的最角落

截图代码如下:

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

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

public class Test extends JFrame {

    Test() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(900, 600);

        JPanel left = new JPanel();
        left.setBackground(Color.BLUE);

        JPanel right = new JPanel();

        JLabel fox = new JLabel("The quick brown fox jumps over the lazy dog.");
        fox.setFont(new Font(null, 0, 50));

        JPanel rightBottom = new JPanel();
        rightBottom.setLayout(new GridLayout(10, 10));
        for (int i = 1; i <= 100; i++) {
            rightBottom.add(new JButton("butt" + i));
        }

        CellConstraints cc = new CellConstraints();
        this.setLayout(new FormLayout("100dlu,p:g", "f:p:g"));
        this.add(left, cc.xy(1, 1));
        this.add(right, cc.xy(2, 1));
        right.setLayout(new FormLayout("f:p:g", "p,5dlu,f:p:g"));
        right.add(fox, cc.xy(1, 1));
        right.add(rightBottom, cc.xy(1, 3));

    }

    public static void main(String[] args) {
        new Test().setVisible(true);
    }
}

【问题讨论】:

  • 使用不同的布局管理器。例如边框布局。您可以将标签添加到 NORTH,然后创建第二个面板,其中包含使用添加到 CENTER 的 GridLayout 的所有按钮。否则,如果您仍想使用 FormLayout,那么我建议您需要创建一个 TopRight(用于标签)和 BottomRight(用于按钮)面板,每个面板将使用不同的约束。
  • BorderLayout 和将 fox 用另一个 FormLayout 包装在自己的面板中都没有帮助。

标签: java swing layout-manager jgoodies form-layout


【解决方案1】:

首选大小的规范使布局以它们的首选大小显示按钮。结果有些按钮不适合。尝试指定不同的约束。例如,使用结合增长和填充的恒定大小。例如试试这些:

this.setLayout(new FormLayout("100dlu,1dlu:g", "f:1dlu:g"));

right.setLayout(new FormLayout("f:1dlu:g", "p,5dlu,f:1dlu:g"));

但某些尺寸的按钮标题不适合。

这是一个结果:

【讨论】:

  • 这正是我所需要的!谢谢!
【解决方案2】:

BorderLayout ...没有帮助

对我来说很好用:

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

public class Test8 extends JFrame {

    Test8() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(900, 600);

        JPanel left = new JPanel();
        left.setBackground(Color.BLUE);

        JPanel right = new JPanel(new BorderLayout());

        JLabel fox = new JLabel("The quick brown fox jumps over the lazy dog.");
        fox.setFont(new Font(null, 0, 50));

        JPanel rightBottom = new JPanel();
        rightBottom.setLayout(new GridLayout(10, 10));
        for (int i = 1; i <= 100; i++) {
            rightBottom.add(new JButton("butt" + i));
        }

        right.add(fox, BorderLayout.NORTH);
        right.add(rightBottom, BorderLayout.CENTER);
        add(right);

    }

    public static void main(String[] args) {
        new Test8().setVisible(true);
    }
}

如果您不喜欢标签中显示的点,请尝试使用不可编辑的文本字段。

当某些东西不起作用时,请发布您尝试过的代码。口头解释无济于事。

【讨论】:

  • 有问题的代码只是一个简短的、自包含的、可编译的示例;在实际代码中它不起作用。在 Aqua 的回答之后,我发现问题出在另一个包含所有内容的 FormLayout 上;它也必须修复。
  • @KarolS,SSCCE 应该会显示问题,因此我们不会猜测您可能在做什么,也可能不做什么。如果我们没有所有信息,我们如何才能给出完整的答案。我们没有时间花在猜测上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2014-05-08
相关资源
最近更新 更多