Показывать ScrollBars в FlowLayout только при необходимости - PullRequest
5 голосов
/ 15 ноября 2011

Я перефразирую свой вопрос: **

Как предотвратить включение Java ScrollBar в FlowLayout, когда достаточно места для отображения всех элементов путем их деформации

example**

Вот скриншот того, чего я пытаюсь достичь:

Обратите внимание, что полоса прокрутки отключена, когда в ней нет необходимости. enter image description here

А при изменении размера должна появиться полоса прокрутки окна, если некоторые элементы находятся вне плоскости обзора enter image description here

P.S. Я в курсе вещей, называемых документацией и сетью.

Ответы [ 3 ]

3 голосов
/ 20 ноября 2011

Ваши обновленные снимки экрана показывают, что вы, возможно, ищете Wrap Layout .

3 голосов
/ 16 ноября 2011

По умолчанию используется политика полосы прокрутки , но я помню, что приходилось учитывать пробелы FlowLayout, чтобы изначально получить четное число. Если вы растянете этот пример, горизонтальная полоса прокрутки исчезнет.

Обновление: это действительно не решает вашу проблему, но показывает, как я реализовал Scrollable. Я хотел избавиться от setPreferredSize(), даже если изображение просто заполнитель. В статье Wrap Layout рассказывается, почему FlowLayout работает так, как работает.

import javax.swing.*;
import java.awt.*;
import java.util.Random;

public class ImageScrollTest extends JPanel implements Scrollable {

    private static final int N = 8;
    private static final int W = 120;
    private static final int H = 100;
    private final FlowLayout layout = new FlowLayout();
    private final int hGap = layout.getHgap();
    private final int vGap = layout.getVgap();
    private final Dimension size;

    // Show n of N images in a Scrollable FlowLayout
    public ImageScrollTest(int n) {
        setLayout(layout);
        for (int i = 0; i < N; i++) {
            this.add(new ImagePanel());
        }
        size = new Dimension(n * W + (n + 1) * hGap, H + 2 * vGap);
    }

    @Override
    public Dimension getPreferredScrollableViewportSize() {
        return size;
    }

    @Override
    public int getScrollableUnitIncrement(
        Rectangle visibleRect, int orientation, int direction) {
        return getIncrement(orientation);
    }

    @Override
    public int getScrollableBlockIncrement(
        Rectangle visibleRect, int orientation, int direction) {
        return getIncrement(orientation);
    }

    private int getIncrement(int orientation) {
        if (orientation == JScrollBar.HORIZONTAL) {
            return W + hGap;
        } else {
            return H + vGap;
        }
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return false;
    }

    @Override
    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    private static class ImagePanel extends JPanel {

        private static final Random rnd = new Random();
        private Color color = new Color(rnd.nextInt());

        public ImagePanel() {
            this.setBackground(color);
            this.setBorder(BorderFactory.createLineBorder(Color.blue));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(W, H);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ImageScrollTest ist = new ImageScrollTest(N / 2);
        JScrollPane sp = new JScrollPane(ist);
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        f.add(sp);
        f.pack();
        f.setVisible(true);
    }
}
0 голосов
/ 16 ноября 2011

Вы должны указать scrollPane, когда хотите, чтобы полосы прокрутки появлялись (возможно как в горизонтальном, так и в вертикальном направлении):

myScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

Также есть: HORIZONTAL_SCROLLBAR_ALWAYS и HORIZONTAL_SCROLLBAR_NEVER, если вам это нужнов ближайшее время.

РЕДАКТИРОВАТЬ: Для получения дополнительной информации и точно мой ответ: http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...