当前位置: 首页 > 知识库问答 >
问题:

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

赏阳嘉
2023-03-14

我也看过这个问题,但没有帮助:添加JPanel时JScrollPane不显示滚动条

使用空布局是有意的,我正在做我自己的格式化,而不是考虑多个大小的屏幕。提前感谢!

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个答案

万俟高峻
2023-03-14

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

    }
}

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

 类似资料:
  • 我注意到在添加滚动条时会调整高度内容的大小(因为内容超过了宽度)。 密码... 注意:如果我使用,它会在最大化窗口时增加边框之间的间距,我不希望这样。 正如您所看到的,第2行被切断了,是否有必要不调整它的大小(除了将它设置为,如果最大化窗口,它仍然显示条形)?

  • 问题内容: 将矩形放在QGraphicsScene中并使其可以用鼠标移动后,如何用鼠标调整大小? 如果没有人知道答案,那么一个例子也可能很好,我正在使用PyQt4在Python中进行开发。 我知道这里有类似的问题,但它们分别没有回答我。 我的简化代码: 问题答案: 您将需要自己调整大小。要做到这一点,你需要继承和实现鼠标事件处理函数:,,。总体思路如下: 您创建了一组手柄,可用于调整形状的大小。

  • 问题内容: 在Java应用程序中使用时,我遇到了一个小问题。 我有一个。这被动态地与按钮(垂直排序),其可以是任何宽度的更新。的自动调整其宽度最大的部件内部。 现在,当出现垂直滚动条时,它会占用my右侧的一些空间,这将导致最大的按钮无法完全显示。除了显示整个按钮之外,我不想使用水平滚动条。 当滚动条出现时,是否有办法调整我的大小,使其很好地显示在我的按钮旁边?还是有其他方法可以使滚动条出现在我的旁

  • 问题内容: 如本问题所述(将图像包装到Jframe中),我需要一个jframe来匹配提供的确切图像(图像本身最初是已转换为图像的PDF) 所提供的解决方案确实为我的图像尺寸构建了一个jframe,但实际上看不到所有图像。我需要能够调整jframe的大小,并使图像动态调整为新的jframe大小。失败的话,我想如果我可以滚动jframe或什至放大或缩小,至少可以到达当前无法看到的图像部分。 我需要这个

  • 正如在这个问题中讨论的(将图像包装到Jframe),我需要一个Jframe来匹配精确提供的图像(图像本身最初是一个PDF,已经转换为图像)