Java 当使用JGoodies FormLayout时,如何使大型组件不破坏布局?

Java 当使用JGoodies FormLayout时,如何使大型组件不破坏布局?,java,swing,layout-manager,jgoodies,form-layout,Java,Swing,Layout Manager,Jgoodies,Form Layout,我使用的是JGoodies Forms 1.8.0 我一直有一个问题,当一个超大的标签导致整个布局不再适合一个窗口。我希望该文本能够被直观地裁剪,因此对于用户来说,文本显然不适合,但是GUI的其余部分仍然应该保持适合 我准备了一个简单的例子,展示了同样的行为。这里一切正常,因为窗口足够大: 这里是同一个窗口,但已调整大小: 请注意,最右边的列不再可见 预期效果如下: 如果文本合适,则应完整显示 如果文本不合适,则应将其结尾部分剪掉 文本应该左对齐 所有按钮应始终可见 按钮100应该在窗口的

我使用的是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);
    }
}
import com.jgoodies.forms.layout.CellConstraints;
导入com.jgoodies.forms.layout.FormLayout;
导入java.awt.*;
导入javax.swing.*;
公共类测试扩展了JFrame{
测试(){
setDefaultCloseOperation(关闭时退出);
设置大小(900600);
JPanel left=新的JPanel();
左。挫折背景(颜色。蓝色);
JPanel right=新的JPanel();
JLabel-fox=新的JLabel(“敏捷的棕色狐狸跳过懒惰的狗”);
setFont(新字体(null,0,50));
JPanel rightbooth=新的JPanel();
setLayout(新的GridLayout(10,10));
对于(int i=1;i
边界布局…没有帮助

对我来说很好:

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);
    }
}
import java.awt.*;
导入javax.swing.*;
公共类Test8扩展了JFrame{
Test8(){
setDefaultCloseOperation(关闭时退出);
设置大小(900600);
JPanel left=新的JPanel();
左。挫折背景(颜色。蓝色);
JPanel right=newjpanel(newborderlayout());
JLabel-fox=新的JLabel(“敏捷的棕色狐狸跳过懒惰的狗”);
setFont(新字体(null,0,50));
JPanel rightbooth=新的JPanel();
setLayout(新的GridLayout(10,10));
对于(int i=1;i
边界布局…没有帮助

对我来说很好:

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);
    }
}
import java.awt.*;
导入javax.swing.*;
公共类Test8扩展了JFrame{
Test8(){
setDefaultCloseOperation(关闭时退出);
设置大小(900600);
JPanel left=新的JPanel();
左。挫折背景(颜色。蓝色);
JPanel right=newjpanel(newborderlayout());
JLabel-fox=新的JLabel(“敏捷的棕色狐狸跳过懒惰的狗”);
setFont(新字体(null,0,50));
JPanel rightbooth=新的JPanel();
setLayout(新的GridLayout(10,10));

对于(int i=1;i首选大小的指定会使布局以其首选大小显示按钮。因此,某些按钮不适合。请尝试指定其他约束。例如,使用恒定大小并结合“增长”和“填充”。例如,请尝试以下操作:

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

right.setLayout(new FormLayout("f:1dlu:g", "p,5dlu,f:1dlu:g"));
但在某些尺寸下,按钮标题将不适合

结果如下:


首选大小的指定使布局以其首选大小显示按钮。因此,某些按钮不适合。请尝试指定其他约束。例如,使用恒定大小并结合“增长”和“填充”。例如,请尝试以下操作:

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

right.setLayout(new FormLayout("f:1dlu:g", "p,5dlu,f:1dlu:g"));
但在某些尺寸下,按钮标题将不适合

结果如下:


使用不同的布局管理器。例如BorderLayout。您可以将标签添加到北部,然后创建第二个面板,其中包含使用添加到中部的GridLayout的所有按钮。否则,如果您仍要使用FormLayout,我建议您需要创建右上角(标签)和右下角(用于按钮)面板和每个面板将使用不同的控件。
BorderLayout
和用另一个
FormLayout
在自己的面板中包装
fox
都没有帮助。使用不同的布局管理器。例如BorderLayout。您可以将标签添加到北部,然后创建第二个面板,其中包含使用Gri的所有按钮D添加到中间的布局。否则,如果您仍要使用FormLayout,则我建议您需要创建右上角(用于标签)和右下角(用于按钮)面板和每个面板都会使用不同的约束。无论是
BorderLayout
还是用另一个
FormLayout
在自己的面板中包装
fox
都没有帮助。这正是我需要的!谢谢!这正是我需要的!谢谢!所讨论的代码只是一个简短的、自包含的、可编译的示例;在实际代码中它不起作用。在Aqua回答后,我发现问题在于另一个包含所有内容的FormLayout;它也必须被修复。@KarolS,好吧,SSCE应该显示问题,这样我们就不会猜测你可能在做什么或可能不在做什么。如果我们没有所有的信息,我们怎么能给出完整的答案。我们没有时间去猜测。c问题中的ode只是一个简短的、自包含的、可编译的示例;在实际代码中,它不起作用。在Aqua回答后,我发现问题在于另一个包含所有内容的FormLayout;它也必须被修复。@KarolS,SSCE应该显示问题,这样我们就不会猜测您可能在做什么或不做什么。如果我们没有所有的我们怎样才能给出一个完整的答案。我们没有时间去猜测。