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, но я хочу иметь максимальный размер этих компонентов:)
1 ответ
Это не имеет ничего общего с макетами, и все из-за того, что вы ограничиваете размер компонента JPanel здесь:
JPanel container = new JPanel();
container.setPreferredSize(new Dimension(10, 10)); // *****
scrollPane_4.setViewportView(container);
По телефону setPreferredSize(...)
ваш контейнер JPanel не станет больше этого размера. Решение: не делай этого, не звони setPreferredSize(...)
, Либо размер вашего компонента соответствует его естественному предпочтительному размеру, который зависит от компонентов, которые он содержит, либо переопределяет его getPreferredSize()
метод для возврата размера, который имеет смысл, в зависимости от состояния графического интерфейса.