Swing 组件中不仅具有 JFrame 和 JDialog 这样的顶级窗口,还提供了一些中间容器,这些容器不能单独存在,只能放置在顶级窗口中。其中最常见的中间容器就有两种—— JPanel 和 JScrollPane,接下来分别介绍这两种容器。
- JPanle:JPanel 和 AWT 中的 Panle 组件使用方法基本一致,它是一个无边框,不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是 FlowLayout。当然也可以使用 JPanel 带参数的构造方法 JPanel(LayoutManager Layout)或者它的 setLayout()方法为其制定布局管理器。
- 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) | 设置在滚动条面板显示的组件 |
接下来通过一个案例来演示一下向中间容器添加按钮,如下所示。
import java.awt.*;
import javax.swing.*;
public class example17 extends JFrame {
public example17() {
this.setTitle("PanelDemo");
//创建滚动面板
JScrollPane scrollPane = new JScrollPane();
//设置水平滚动条策略——滚动条在需要时显示
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
//设置垂直滚动条策略——滚动条一直显示
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
//创建一个 JPanel 面板
JPanel panel = new JPanel();
//在 JPanel 中添加四个按钮
panel.add(new Button("按钮 1 "));
panel.add(new Button("按钮 2 "));
panel.add(new Button("按钮 3 "));
panel.add(new Button("按钮 4 "));
//设置 JPanel 面板在滚动面板里显示
scrollPane.setViewportView(panel);
//将滚动面板添加到内容面板的 CENTER 区域
this.add(scrollPane, BorderLayout.CENTER);
//设置单击关闭按钮时的默认操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 250);
this.setVisible(true);
}
public static void main(String[] args) {
new example17();
}
}
运行程序,生成的窗口如下所示。
上述代码块中,为了演示如何使用中间容器,分别创建了一个 JScrollPane 滚动面板、一个 JPanel 面板和四个按钮。首先将四个按钮添加到 JPanel 面板中,然后将该容器添加到 JScrollPane 面板中。
由于 JScrollPane 指定的水平滚动条策略为 HORIZONTAL_SCROLLBAR_NEED,因此只有在面板区域中无法完整显示其内部放置的组件时,才会显示出水平滚动条。而 JScrollPane 的垂直滚动条策略为 VERTICAL_SCROLLBAR_ALWAYS,所以垂直方向的滚动条会一直存在。
ps:这里说明一下,JScrollPane 滚动面板,不仅仅是水平和垂直两个滚动条,而是一个“面板”。在本小节中因为设置了边界布局管理器,并且将 JScrollPane 在了 CENTER 区域,且其他区域没有进行操作,所以无法直观的观察到滚动面板所在的位置。代码块中 23 行。