Я пытаюсь создать панель с горизонтально расположенными компонентами, с автоматическим переносом, если места недостаточно, и вертикальной полосой прокрутки.
Примерно так:
+-----------------+
|[1][2][3][4][5] |
| |
+-----------------+
уменьшениеширина:
+-----------+
|[1][2][3] |
|[4][5] |
+-----------+
снова уменьшая ширину, появляется полоса прокрутки:
+---------+
|[1][2] ^|
|[3][4] v|
+---------+
Я не далеко от решения:
public class TestFlow extends JFrame {
public TestFlow() {
getContentPane().setLayout(new BorderLayout());
JPanel panel = new JPanel(new FlowLayout());
JScrollPane scroll = new JScrollPane(panel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
getContentPane().add(scroll, BorderLayout.CENTER);
panel.add(new MyComponent("A"));
panel.add(new MyComponent("B"));
panel.add(new MyComponent("C"));
panel.add(new MyComponent("D"));
panel.add(new MyComponent("E"));
panel.add(new MyComponent("F"));
panel.add(new MyComponent("G"));
panel.add(new MyComponent("H"));
panel.add(new MyComponent("I"));
panel.add(new MyComponent("J"));
panel.add(new MyComponent("K"));
panel.add(new MyComponent("L"));
panel.add(new MyComponent("M"));
panel.add(new MyComponent("N"));
panel.add(new MyComponent("O"));
scroll.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
Dimension max=((JScrollPane)e.getComponent()).getViewport().getExtentSize();
// panel.setMaximumSize(new Dimension(max.width,Integer.MAX_VALUE));
panel.setPreferredSize(new Dimension(max.width,Integer.MAX_VALUE));
// panel.setPreferredSize(max);
panel.revalidate();
// panel.repaint();
// System.out.println(panel.getSize().width+"--"+max.width);
}
});
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(500, 200);
setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new TestFlow().setVisible(true));
}
private static class MyComponent extends JLabel {
public MyComponent(String text) {
super(String.join("", Collections.nCopies((int)(Math.round(Math.random()*4)+4), text)));
setOpaque(true);
setBackground(Color.YELLOW);
}
}
}
, нопо-прежнему странное поведение:
С решением panel.setPreferredSize(new Dimension(max.width,Integer.MAX_VALUE));
- после изменения размера окна панель становится пустой.Я должен вручную переместить полосу прокрутки, чтобы содержимое отображалось
- , полоса прокрутки всегда видна, в то время как она не должна
С решением panel.setPreferredSize(max);
- после изменения размера окна панель не выкладывается заново.Я должен вручную переместить окно во второй раз, чтобы перерисовать содержимое.
- полоса прокрутки никогда не видна, хотя она должна.
Есть какие-либо предложения в этом коде?