java - JScrollPane 在鼠标滚动或调整框架大小之前不显示内容

标签 java swing jscrollpane

我有一个 JScrollPane,其中有一个 JPanel,除了一个缺陷之外,它工作得很好。当我运行该程序时,JScrollPane 被添加并显示在其父面板上,但它内部的内容没有显示。

如果我调整窗口大小或者在 JPanel 上滚动,内容会立即显示。我还检查过 JPanel 和 JScrollPane 的尺寸都是正确的。 Repaint 也被调用,所以我不认为我错过了任何东西。

我也看过这个问题,但没有帮助: JScrollPane doesn't show scroll bars when JPanel is added

故意使用空布局,我正在执行自己的格式,而不是考虑多种尺寸的屏幕。提前谢谢您!

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);
        }
    }
}

最佳答案

“主要”问题是 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);
        }

    }
}

如果您需要更多控制,那么您可能需要查看可滚动界面,但这是另一个复杂程度

关于java - JScrollPane 在鼠标滚动或调整框架大小之前不显示内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60824760/

相关文章:

java - 仅对表格 View 中的一个单元格着色

java - gridbaglayout 的第二行滚动出容器

java - 滚动条在 JPanel 内的 JScrollPane 上不起作用

java - 如何比 ComponentListener 更好地监听 componentShown/componentHidden 事件?

java - 从滚动 Pane 中的文本 Pane 获取文本

java - 如何使用 BigDecimal 正确除法

java - 如何检查重复输入并防止将其添加到数据库中

java - 带参数的 HTTP 多部分 POST?

java - 数字键盘显示不正确

Java - 选择菜单中的所有项目