Java 如何使JPanel可滚动?

Java 如何使JPanel可滚动?,java,swing,jscrollpane,Java,Swing,Jscrollpane,我正在为我的大学项目创建GUI,并试图了解JScrollPane是如何工作的 我已经成功地编写了以滚动方式显示图片的简单程序: public class ScrollPaneTest{ public static void main(String[] args){ JFrame testFrame = new JFrame("ramka testowa"); testFrame.setDefaultCloseOperation(JFrame.EXIT_ON

我正在为我的大学项目创建GUI,并试图了解
JScrollPane
是如何工作的

我已经成功地编写了以滚动方式显示图片的简单程序:

public class ScrollPaneTest{
    public static void main(String[] args){
        JFrame testFrame = new JFrame("ramka testowa");
        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel picture = new JLabel(new ImageIcon("JavaSwingCompoentsList.PNG"));
        JScrollPane scrollPane = new JScrollPane(picture);

        testFrame.add(scrollPane, BorderLayout.CENTER);
        testFrame.setSize(400, 400);
        testFrame.setVisible(true);
    }
}
尽管如此,在我的最终GUI中,我只想将
JScrollPane
应用于它的一部分,例如single
JPanel
。为了验证这一想法,我编写了以下代码,但不幸的是,这些代码不起作用:

public class ScrollPaneTest{
    public static void main(String[] args){
        JFrame testFrame = new JFrame("ramka testowa");
        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel picture = new JLabel(new ImageIcon("JavaSwingCompoentsList.PNG"));
        JScrollPane scrollPane = new JScrollPane(picture);

        JPanel insidePanel = new JPanel();
        insidePanel.add(scrollPane);
        testFrame.add(insidePanel, BorderLayout.CENTER);

        testFrame.setSize(400, 400);
        testFrame.setVisible(true);

    }
}
我已经阅读了很多教程,以及Stack和CodeRanch的文章,但我仍然无法理解
JScrollPane
是如何工作的。我怀疑,我的错误与指定要滚动的
JPanel
-的维度有关,但我尝试的每一种方法都没有给我任何滚动条或图片

如果你能告诉我这个问题的正确解决方案,最重要的是,告诉我哪里错了,我将非常感激

  • 用图片初始化
    JPanel
    ,而不是
    JScrollPane
  • 要将
    JPanel
    添加到
    JScrollPane
    ,请执行以下操作:

    scrollPane.setViewportView (panel)
    
  • JScrollPane
    而不是
    JPanel
    添加到
    JFrame


  • 最简单的方法是创建JPanel并在创建JScrollPane时指定它:

     JPanel myPanel = ...;
     JScrollPane scroller = new JScrollPane( myPanel );
    

    然后只需将滚动条添加到GUI(而不是添加myPanel)。

    问题似乎来自内部面板的默认
    FlowLayout
    。将它更改为另一个布局(我使用
    BordeLayout
    ),它应该可以工作。话虽如此,我无法解释为什么流布局失败

    import java.awt.BorderLayout;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    
    public class ScrollPaneTest {
    
        public static void main(String[] args) {
            JFrame testFrame = new JFrame("ramka testowa");
            testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JLabel picture = new JLabel(new ImageIcon(
                    new BufferedImage(370, 1200, BufferedImage.TYPE_INT_RGB)));
            JScrollPane scrollPane = new JScrollPane(picture);
    
            JPanel insidePanel = new JPanel(new BorderLayout());
            insidePanel.add(scrollPane);
            testFrame.add(insidePanel, BorderLayout.CENTER);
    
            insidePanel.add(new JLabel("Stay"), BorderLayout.LINE_START);
            insidePanel.add(new JLabel("Stay"), BorderLayout.LINE_END);
            insidePanel.add(new JLabel("Stay"), BorderLayout.PAGE_START);
            insidePanel.add(new JLabel("Stay"), BorderLayout.PAGE_END);
    
            testFrame.pack();
    
            testFrame.setSize(400, 400);
            // failing to do this will end the main & the app.
            // doing it will cause the EDT to start.
            testFrame.setVisible(true);
        }
    }