Swing 组件中不仅具有 JFrame 和 JDialog 这样的顶级窗口,还提供了一些中间容器,这些容器不能单独存在,只能放置在顶级窗口中。其中最常见的中间容器就有两种—— JPanel 和 JScrollPane,接下来分别介绍这两种容器。

    1. JPanle:JPanel 和 AWT 中的 Panle 组件使用方法基本一致,它是一个无边框不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是 FlowLayout。当然也可以使用 JPanel 带参数的构造方法 JPanel(LayoutManager Layout)或者它的 setLayout()方法为其制定布局管理器。
    2. JScrollPane:与 JPanel 不同的是,JScrollPane 是一个带有滚动条的面板**容器,而且这个面板只能添加一个组件如果想在 JScrollPane 面板中添加多个组件,应该先将组件添加到 JPanel 中,然后将 JPanel 添加到 JScrollPane 中。**

    接下来学习一下 JScrollPane 的常用构造方法,如下表所示。

    方法声明 功能描述
    JScrollPane() 创建一个空的 JScrollPane 面板
    JScrollPane(Component view) 创建一个显示指定组件的 JScrollPane 面板,只要组件的内容超过视图大小就会显示水平和垂直滚动条
    JScrollPane(Component view, int vsbPolicy, int hsbPolicy) 创建一个显示指定容器并具有指定滚动条策略的 JScrollPane。参数 vsbPolicy 和hsbPolicy 分别表示垂直滚动条策略和水平滚动条策略,应指定为 ScrollPaneConstants 的静态常量,如下所示。
    - HORIZONTAL_SCROLLBAR_AS_NEEDED:表示水平滚动条只在需要时显示,是默认策略
    - HORIZONTAL_SCROLLBAR_NRVER:表示水平滚动条永远不显示
    - HORIZONTAL_SCROLLBAR_ALWAYS:表示水平滚动条一直显示

    上表中列出了 JScrollPane 的 3 个构造方法。其中,第一个构造方法用于创建一个空的 JScrollPane 面板,第二个构造方法用于创建显示指定组件的 JScrollPane 面板,这两个方法都比较简单。第三个构造方法是在第二个构造方法的基础上指定滚动条策略。

    如果在构造方法中没用指定显示组件和滚动条策略,也可以使用 JScrollPane 提供的方法进行设置,如下表所示。

    方法声明 功能描述
    void setHorizontalBarPolicy(int policy) 指定水平滚动条策略,即水平滚动条何时显示在滚动面板上
    void setVerticalBarPolicy(int policy) 指定垂直滚动条策略,即垂直滚动条合适显示在滚动面板上
    void setViewportView(Component view) 设置在滚动条面板显示的组件

    接下来通过一个案例来演示一下向中间容器添加按钮,如下所示。

    1. import java.awt.*;
    2. import javax.swing.*;
    3. public class example17 extends JFrame {
    4. public example17() {
    5. this.setTitle("PanelDemo");
    6. //创建滚动面板
    7. JScrollPane scrollPane = new JScrollPane();
    8. //设置水平滚动条策略——滚动条在需要时显示
    9. scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    10. //设置垂直滚动条策略——滚动条一直显示
    11. scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    12. //创建一个 JPanel 面板
    13. JPanel panel = new JPanel();
    14. //在 JPanel 中添加四个按钮
    15. panel.add(new Button("按钮 1 "));
    16. panel.add(new Button("按钮 2 "));
    17. panel.add(new Button("按钮 3 "));
    18. panel.add(new Button("按钮 4 "));
    19. //设置 JPanel 面板在滚动面板里显示
    20. scrollPane.setViewportView(panel);
    21. //将滚动面板添加到内容面板的 CENTER 区域
    22. this.add(scrollPane, BorderLayout.CENTER);
    23. //设置单击关闭按钮时的默认操作
    24. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    25. this.setSize(400, 250);
    26. this.setVisible(true);
    27. }
    28. public static void main(String[] args) {
    29. new example17();
    30. }
    31. }

    运行程序,生成的窗口如下所示。
    QQ截图20200623152356.png
    上述代码块中,为了演示如何使用中间容器,分别创建了一个 JScrollPane 滚动面板、一个 JPanel 面板和四个按钮。首先将四个按钮添加到 JPanel 面板中,然后将该容器添加到 JScrollPane 面板中。

    由于 JScrollPane 指定的水平滚动条策略为 HORIZONTAL_SCROLLBAR_NEED,因此只有在面板区域中无法完整显示其内部放置的组件时,才会显示出水平滚动条。而 JScrollPane 的垂直滚动条策略为 VERTICAL_SCROLLBAR_ALWAYS,所以垂直方向的滚动条会一直存在。

    ps:这里说明一下,JScrollPane 滚动面板,不仅仅是水平和垂直两个滚动条,而是一个“面板”。在本小节中因为设置了边界布局管理器,并且将 JScrollPane 在了 CENTER 区域,且其他区域没有进行操作,所以无法直观的观察到滚动面板所在的位置。代码块中 23 行。