JScrollPane не показывает содержимое до прокрутки мышью или изменения размера кадра - PullRequest
0 голосов
/ 24 марта 2020

У меня есть JScrollPane с JPanel, которая отлично работает, за исключением одного недостатка. Когда я запускаю программу, JScrollPane добавляется и очень хорошо отображается на родительской панели, однако содержимое внутри нее не отображается.

Если я изменяю размер окна или прокручиваю на JPanel содержимое появляется сразу. Я также проверил, и размеры правильны как для JPanel, так и для JScrollPane. Также вызывается перекраска, поэтому я не думаю, что я что-то там упускаю.

Я также посмотрел на этот вопрос, но он не помог: JScrollPane не показывает полосы прокрутки, когда JPanel добавлено

Использование пустых макетов преднамеренно, вместо этого я делаю свое собственное форматирование для учета экранов нескольких размеров. Спасибо заранее!

class FilesPanel extends JPanel
{
    public JScrollPane scroller;
    private FileHolderPanel holder;

    public FilesPanel()
    {
        //setLayout(null);
        setBackground(extraLight);

        holder = new FileHolderPanel();

        System.out.println(holder.getWidth() + " " + holder.getHeight() + " " + holder.getX() + " " + holder.getY() + " " + holder.getBounds());

        scroller = new JScrollPane();

        JViewport viewport = new JViewport();
        viewport.add(holder);
        scroller.setViewport(viewport);

        scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

        scroller.setBorder(BorderFactory.createEmptyBorder());
        scroller.setBackground(blue);
        add(scroller);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        scroller.setLocation(0, 0);
        scroller.setSize(filesWidth, frame.getHeight() - 40);
    }

    class FileHolderPanel extends JPanel
    {
        public FileHolderPanel()
        {
            setBackground(extraLight);
            setLayout(null);
            setVisible(true);
        }

        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
        }
    }
}

1 Ответ

2 голосов
/ 24 марта 2020

«Основной» проблемой является тот факт, что FileHolderPanel не имеет понятия о размере, который он хотел бы видеть, поэтому JScrollPane не имеет ни малейшего значения, насколько большим он должен быть, или когда он должен отображать полосы прокрутки. , Это немного догадка, так как вы не предоставили полностью работоспособный пример.

Что-то вроде приведенного ниже примера работает нормально ...

Example

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new ContentPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ContentPane extends JPanel {

        public ContentPane() {
            setLayout(new BorderLayout());
            JScrollPane scrollPane = new JScrollPane(new FileHolderPane());
            scrollPane.setBorder(BorderFactory.createEmptyBorder());
            scrollPane.setBackground(Color.BLUE);
            add(scrollPane);
        }

    }

    public class FileHolderPane extends JPanel {

        public FileHolderPane() {
            setBackground(Color.RED);
            setLayout(new GridBagLayout());
            add(new JLabel("All your content is belong to us"));
        }

        @Override
        public Dimension getPreferredSize() {
            // This will make the panel a fixed size, so beware of that
            return new Dimension(400, 400);
        }

    }
}

Если вам нужно больше контроля, то вам, вероятно, нужно взглянуть на Scrollable interface, но это еще один уровень сложности

...