Как сделать большие компоненты, чтобы не взорвать макет при использовании JGoodies FormLayout?

Я использую JGoodies Forms 1.8.0

У меня возникла проблема, когда из-за одной большой метки весь макет больше не помещался в окне. Я хотел бы, чтобы этот текст был обрезан визуально, так что для пользователя очевидно, что текст не подходит, но остальная часть графического интерфейса все еще должна соответствовать.

Я подготовил упрощенный пример, демонстрирующий то же поведение. Здесь все работает нормально, потому что окно достаточно большое:

И тут то же окно, но с измененным размером:

Обратите внимание, что самые правые столбцы больше не видны.

Желаемый эффект заключается в следующем:

  • если текст подходит, он должен отображаться полностью

  • если текст не помещается, его конец должен быть обрезан

  • текст должен быть выровнен по левому краю

  • все кнопки должны быть видны постоянно

  • кнопка 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);
    }
}

2 ответа

Решение

Спецификация предпочтительного размера делает макет для отображения кнопок в их предпочтительном размере. В результате некоторые кнопки не подходят. Попробуйте указать другое ограничение. Например, используйте постоянный размер с комбинацией роста и заполнения. Например попробуйте это:

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

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

При определенных размерах заголовки кнопок не подойдут.

Вот результат:

введите описание изображения здесь

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);
    }
}

Если вам не нравятся точки, отображаемые на этикетке, попробуйте не редактируемое текстовое поле.

Если что-то не работает, отправьте код, который вы пробовали. Устное объяснение не помогает.

Другие вопросы по тегам