Установите ширину области просмотра равной ширине полосы прокрутки - PullRequest
1 голос
/ 12 июня 2019

Есть ли способ зафиксировать ширину области просмотра JScrollPane равной ширине ее владельца (JScrollPane).Моя цель - JScrollPane, с которой можно просто прокрутить вниз, но ширина области просмотра сжата / установлена ​​в размер JScrollPane.

Я попытался установить размер области просмотра вручную, но это не удалось, потому что я использовал GridLayout для разметки компонентов.Я также попробовал GridBagLayout и установил Constraints для Viewport и его компонентов.Я также выключил горизонтальный скроллер.

Я НЕ знакомый по ширине Java FX.

1 Ответ

2 голосов
/ 12 июня 2019

Вам просто нужно реализовать интерфейс Scrollable для вашей панели. Вот пример:

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * <code>ScrollableExample</code>.
 */
public class ScrollableExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ScrollableExample());
    }

    @Override
    public void run() {
        JPanel scrollPanel = new ScrollablePanel();
        scrollPanel.setLayout(new GridLayout(20, 1));
        for (int i = 0; i < 20; i++) {
            scrollPanel.add(new JLabel("It's a simple label to test whether scrolling works " + i));
        }
        JFrame frm = new JFrame("Test scrolling");
        frm.add(new JScrollPane(scrollPanel));
        frm.setSize(220, 200);
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class ScrollablePanel extends JPanel implements Scrollable {

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

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

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

        @Override
        public boolean getScrollableTracksViewportWidth() {
            // no horizontal scroll bar
            return true;
        }

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

    }
}
...