Ограничить ширину Jscrollpanes шириной Parents при динамическом добавлении контента - PullRequest
0 голосов
/ 14 мая 2019

Эй, я новичок в этом

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

Я добавляю и удаляю несколько вещей, таких как Jpanel или JinternalFrame в JScrollPanel.

Большинство вещей, будь то пользовательские классы или менеджер компоновки, которые я пробовал, либо только скрывали полосу прокрутки (но не препятствовали добавлению контента в горизонтальном направлении навсегда), либо только сокращали его.

Я пытался https://tips4java.wordpress.com/2009/12/20/scrollable-panel/ но он только растягивается или сжимается
public class MainView extends JFrame {

    private ScrollablePanel contentPane;
    private JScrollPane scrollPane;
...

в конструкторе:

...
contentPane = new ScrollablePanel(new BorderLayout());
        contentPane.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.NONE);
    contentPane.setScrollableHeight(ScrollablePanel.ScrollableSizeHint.NONE);
        contentPane.setBorder(new EmptyBorder(1, 1, 1, 1));
        scrollPane = new JScrollPane(contentPane);
        setContentPane(scrollPane);

разные Sizehints или Layouts, такие как Flowlayout по умолчанию, либо хуже, либо одинаковы

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

1 Ответ

0 голосов
/ 14 мая 2019

У меня была похожая проблема некоторое время назад, и я смог решить ее с помощью пользовательского JPanel:

/**
 * A panel that can be used in a JScrollPane which always adapts to the
 * width of the JScrollPane (so only vertical scrolling will happen).
 */
public class ParentWidthPanel extends JPanel implements Scrollable {

    private static final long serialVersionUID = 1L;

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

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

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

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

    @Override
    public boolean getScrollableTracksViewportHeight() {
    if (getParent() instanceof JViewport) {
       return ((getParent()).getHeight() > getPreferredSize().height);
    }
    return false;
    }

}

Главное - иметь метод getScrollableTracksViewportWidth() для возврата true.

...