【问题标题】:JScrollPane not showing content until mouse scroll or frame resizingJScrollPane 在鼠标滚动或调整框架大小之前不显示内容
【发布时间】:2020-03-24 03:58:02
【问题描述】:

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

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

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

有意使用 Null 布局,我正在做自己的格式设置,而不是考虑多种尺寸的屏幕。提前谢谢你!

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

【问题讨论】:

  • paintComponent中取出代码,这不是自定义绘画的使用方式,也不是一个好主意。据我所知,“主要”问题是 FileHolderPanel 未能为 JScrollPane 使用提供适当的大小提示
  • viewport.add(holder); 也不是必需的
  • 做你自己的布局比你正在做的事情要复杂得多。布局确实让事情变得更容易。
  • 这里添加了完整的代码文件夹:drive.google.com/drive/folders/…这个类叫做FilePanel
  • 嗨布拉德凯尔。在 Stack Overflow 上,您应该在问题中包含 minimal reproducible example。你不能指望人们去其他地方寻找资源来解决你的问题。不仅如此,Stack Overflow 是一个问题和答案的存储库,旨在帮助任何面临类似问题的人。一旦你从你的谷歌驱动器中删除代码,你的问题就会变得毫无用处。

标签: java swing jscrollpane


【解决方案1】:

“主要”问题是FileHolderPanel 没有它可能想要的大小的概念,因此JScrollPane 不知道它需要多大或何时应该显示它的滚动条.这有点猜测,因为您没有提供完全可运行的示例。

类似下面的例子工作正常...

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,但这是另一个复杂程度

【讨论】:

  • 不幸的是,我尝试了这个并得到了相同的结果。如果您仍然愿意提供帮助,我上传了所有内容,以便您查看完整代码,但我不想在这里发布整个内容,因为它很长。该类称为 FilePanel。 drive.google.com/drive/folders/…
  • @BradKyle 你说你试过了,但也许你应该运行 MadProgrammer 的示例,看看它是否显示出与你所面临的相同的问题。不过我对此表示怀疑,这是滚动窗格的非常标准的代码。然后从 MP 的代码中得到你想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多