JScrollPane не работает с FormLayout

У меня есть JPanel, который использует FormLayout внутри JScrollPane.

По какой-то причине JScrollPane не отображает полосы прокрутки, когда содержимое становится слишком большим.

Я новичок в Java, поэтому, скорее всего, мне не хватает какой-то мелочи :)

Вот мой код до сих пор. Изменение размера окна на меньшую высоту должно привести к тому, что JScrollPane покажет полосы прокрутки, но это не так. Пожалуйста помоги!

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

import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JScrollPane;
import javax.swing.UIManager;

import javax.swing.JLabel;
import javax.swing.border.LineBorder;
import javax.swing.BorderFactory;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;

public class Test7 extends JFrame {

@SuppressWarnings("deprecation")
public Test7() {

    UIManager.put("swing.boldMetal", Boolean.FALSE);

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Test7");
    this.setSize(1000, 700);
    this.setLocationRelativeTo(null);

    JScrollPane scrollPane_4 = new JScrollPane();
    scrollPane_4.setBorder(BorderFactory.createEmptyBorder());
    this.add(scrollPane_4);

    JPanel bottom = new JPanel();
    bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));

    JPanel container = new JPanel();
    container.setPreferredSize(new Dimension(10, 10));

    scrollPane_4.setViewportView(container);

    FormLayout layout = new FormLayout("default", "fill:default:grow");
    PanelBuilder builder = new PanelBuilder(layout, container);
    CellConstraints cc = new CellConstraints();

    layout.appendRow(new RowSpec("pref"));
    builder.add(bottom, cc.xy(1, layout.getRowCount()));        

    JPanel row1 = new JPanel();
    row1.setBackground(Color.decode("#fcfcfc"));
    row1.setLayout(new BoxLayout(row1, BoxLayout.X_AXIS));
    row1.setAlignmentX(JPanel.LEFT_ALIGNMENT);
    row1.setMaximumSize(new Dimension(700, Short.MAX_VALUE));
    bottom.add(row1);

    JLabel lblAaaa = new JLabel("<html>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</html>");
    lblAaaa.setAlignmentY(JPanel.TOP_ALIGNMENT);
    lblAaaa.setBackground(Color.decode("#f2f2f2"));
    lblAaaa.setOpaque(true);
    lblAaaa.setBorder(new LineBorder(Color.decode("#cccccc"),1));
    row1.add(lblAaaa);

    layout.appendRow(new RowSpec("10px"));        

    JPanel bottom2 = new JPanel();
    bottom2.setOpaque(false);
    bottom2.setLayout(new BoxLayout(bottom2, BoxLayout.Y_AXIS));

    layout.appendRow(new RowSpec("pref"));
    builder.add(bottom2, cc.xy(1, layout.getRowCount()));        

    JPanel row2 = new JPanel();
    row2.setBackground(Color.decode("#fcfcfc"));
    row2.setLayout(new BoxLayout(row2, BoxLayout.X_AXIS));
    row2.setAlignmentX(JPanel.RIGHT_ALIGNMENT);
    row2.setMaximumSize(new Dimension(700, Short.MAX_VALUE));
    bottom2.add(row2);

    JLabel lblAaaa2 = new JLabel("<html>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</html>");
    lblAaaa2.setAlignmentY(JPanel.TOP_ALIGNMENT);
    lblAaaa2.setBackground(Color.decode("#a9dff5"));
    lblAaaa2.setOpaque(true);
    lblAaaa2.setBorder(new LineBorder(Color.decode("#8fb4c2"), 1));
    row2.add(lblAaaa2);

    this.setVisible(true);

}

public static void main(String[] args) {
    new Test7();
}
}

ОБНОВЛЕНИЕ 1:

Следуя совету из «Hovercraft», кажется, что полосы прокрутки работают, если я закомментирую строку setPreferredSize, но возникает другая проблема. Макет становится сверхшироким (за пределами экрана) и более. Это может быть связано с setMaximumSize для row1 и row2, но я хочу иметь максимальный размер этих компонентов :)


person Daniele Testa    schedule 12.03.2014    source источник


Ответы (1)


Это не имеет ничего общего с макетами и все из-за того, что вы ограничиваете размер компонента JPanel здесь:

JPanel container = new JPanel();
container.setPreferredSize(new Dimension(10, 10)); // *****

scrollPane_4.setViewportView(container);

При вызове setPreferredSize(...) ваш контейнер JPanel не станет больше этого размера. Решение: не делайте этого, не звоните setPreferredSize(...). Либо установите размер вашего компонента в его собственный естественный предпочтительный размер, который зависит от компонентов, которые он содержит, либо переопределите его метод getPreferredSize(), чтобы он возвращал размер, который имеет смысл, в зависимости от состояния графического интерфейса.

person Hovercraft Full Of Eels    schedule 12.03.2014
comment
Но если я закомментирую эту строку, весь макет станет глючным. Значит, должна быть еще какая-то проблема? - person Daniele Testa; 13.03.2014
comment
@DanieleTesta: да, но эта строка определенно является причиной вашей основной проблемы и абсолютно не позволит вашему контейнеру JPanel стать больше. У тебя впереди еще много работы. - person Hovercraft Full Of Eels; 13.03.2014