繁体   English   中英

如何让JPanel可滚动?

[英]How to make JPanel scrollable?

我正在为我的大学项目创建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仅应用于其中的一部分,例如单个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 -to-scroll的维度有关,但我尝试的每一种方法都没有给我任何滚动条或根本没有图片。

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

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

     scrollPane.setViewportView (panel) 
  3. 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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM