Вертикальная полоса прокрутки не отображается - PullRequest
0 голосов
/ 20 марта 2019

Я только начал качаться. Я пытаюсь сделать приложение галереи. Я получаю изображения, которые я импортировал вручную, и отображаю их. В зависимости от количества столбцов, которые я вставил в параметры, размеры изображений рассчитываются для правильного отображения. Но после определенного количества строк мне нужна полоса прокрутки, которая могла бы прокручивать и отображать остальные изображения.

Изображения отображаются правильно, как я и хотел, но я попытался реализовать полосу прокрутки, и она не появляется.

Не могли бы вы сказать мне, что не так в моем коде?

    GUI(String title, int width, int height, int columns) {
        this.frame = new JFrame();
        this.frameWidth = width;
        this.columns = columns;

        // set Frame's size
        frame.setSize(width, height);

        // set Frame's action on close button clicked
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // set Frame's title
        frame.setTitle(title);
        frame.setResizable(false);

        // set Frame's position at screen's center
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setLocation(dim.width / 2 - frame.getSize().width / 2, (dim.height / 2 - frame.getSize().height / 2));

        panel = new JPanel();
        frame.setLayout(new GridLayout());

        this.scrollBar = new JScrollPane();
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        frame.getContentPane().add(scrollBar, BorderLayout.EAST);

        displayImages();

        frame.setContentPane(panel);
    }

displayImages ():

    private void displayImages() {
        for (File currentImage : getImagesList()) {
            // 5 is flowlayout's default borders
            // 2 because we got left and right borders
            int totalBorders = (columns * 5) * 2;
            int buttonWidth = (frameWidth - totalBorders) / columns;

            ImageIcon image = new ImageIcon(new ImageIcon(currentImage.getAbsolutePath()).getImage().getScaledInstance(buttonWidth - 20, buttonWidth - 50, Image.SCALE_DEFAULT));
            JButton button = new JButton(currentImage.getName());

            button.setPreferredSize(new Dimension(buttonWidth, buttonWidth));
            button.setIcon(image);
            button.setHorizontalTextPosition(AbstractButton.CENTER);
            button.setVerticalTextPosition(AbstractButton.BOTTOM);

            button.addActionListener(e -> onImageClicked(currentImage.getName()));
            panel.add(button);
        }
    }

Спасибо, с наилучшими пожеланиями

1 Ответ

1 голос
/ 20 марта 2019
    panel = new JPanel();
    frame.setLayout(new GridLayout());

    this.scrollBar = new JScrollPane();
    scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    frame.getContentPane().add(scrollBar, BorderLayout.EAST);

    displayImages();

    frame.setContentPane(panel);

Приведенный выше код в основном неверен. Вам необходимо:

  1. установить макет панели и добавить кнопки на панель
  2. добавить панель с кнопками на панель прокрутки

Базовый код должен выглядеть примерно так:

//panel = new JPanel( new GridLayout(0, 1) );
layout = new GridLayout(0, 1);
panel = new JPanel( layout );
displayImages();
//frame.setLayout(new GridLayout());
this.scrollBar = new JScrollPane(panel);
scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
frame.add(scrollBar, BorderLayout.EAST);
//displayImages();
//frame.setContentPane(panel);

Также нет необходимости играть с размерами каждого компонента на панели. GridLayout сделает все кнопки одинакового размера.

Edit:

Если вы хотите увеличить столбцы в GridLayout, просто выполните:

layout.setColumns( layout.getColumns() + 1 );
panel.revalidate(); // this invokes the layout manager
//panel.repaint(); // sometimes needed to force repainting of panel.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...