Pane窗格
Swing中Pane是一类相对独立的控件,中文通常翻译为“窗格”。窗格中可以容纳另一个或多个控件,实现滚动条、标签页等效果。Swing中,有这样几种Pane:JScrollPane
,JTabbedPane
,JSplitPane
,JLayeredPane
,JDesktopPane
。我们这里介绍其中比较常用的几种Pane的用法,需要调整某个笔记中没提到的细节时查阅文档即可。
JScrollPane 滚动条窗格
JScrollPane
是一个带滚动条的窗格,它常用来包裹一个大内容区域,使其能够在容器内滚动显示。下面例子中,我们使用JScrollPane
包裹一个JTextArea
控件,当其中的文本超出控件大小时,滚动条将显示出来。
package com.gacfox.demo;
import javax.swing.*;
public class MainFrame extends JFrame {
public MainFrame() {
JScrollPane spText = new JScrollPane();
JTextArea taText = new JTextArea();
spText.setViewportView(taText);
add(spText);
setSize(300, 200);
setLocationByPlatform(true);
setTitle("Hello, Swing!");
}
}
运行结果如下图所示。
代码中我们创建了一个JTextArea
控件,但是我们直接使用的话它是没有滚动条的,因此我们又创建了一个JScrollPane
,并将JTextArea
控件添加到JScrollPane
中,当文本框中的数据行数超过其高度时,滚动条就出现了。
void setViewportView(Component view)
这个方法把一个控件添加到JScrollPane
中。
除了文本域,所有继承JComponent
的控件也都能使用JScrollPane
。
补充:JScrollPane设计的争议
实际上JScrollPane
设计的就很有争议,因为类似JTextArea
这样的控件显然应该默认带有滚动条,但是Swing并没有这样设计,JTextArea
必须结合JScrollPane
才能实现滚动条,虽然看上去更符合面向对象的设计规范,但很多人觉得这样有点过度设计,给程序员带来了麻烦。
JTabbedPane 标签页窗格
JTabbedPane
是一个带标签的窗格容器,用于将多个面板组织成一个选项卡界面。每个标签代表一个面板,用户可以点击标签切换不同的面板。
package com.gacfox.demo;
import javax.swing.*;
public class MainFrame extends JFrame {
public MainFrame() {
JTabbedPane tpMain = new JTabbedPane();
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
tpMain.addTab("tab1", p1);
tpMain.addTab("tab2", p2);
tpMain.addTab("tab3", p3);
add(tpMain);
setSize(300, 200);
setLocationByPlatform(true);
setTitle("Hello, Swing!");
}
}
运行结果如下图所示。
上面代码创建了一个JTabbedPane
,然后使用addTab()
函数添加了若干了JPanel
。实际上,我们向标签页添加的控件通常都是JPanel
,因为JPanel
还能容纳其他控件。
void addTab(String title, Component component)
添加标签,第一个参数是标签的名字,第二个参数是添加到标签页的控件。
JDesktopPane 虚拟桌面窗格
这里所说的虚拟桌面窗格在其它GUI框架中一般叫MDI,JDesktopPane
配合JInternalFrame
就是Swing中的MDI实现。JDesktopPane
实际上是在JLayeredPane
基础上实现的,后者应用较少,我们这里直接介绍JDesktopPane
。下面代码中,我们创建了JDesktopPane
,并添加了两个JInternalFrame
。
package com.gacfox.demo;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
public class MainFrame extends JFrame {
public MainFrame() {
JInternalFrame if1 = new JInternalFrame("子窗格1");
if1.setSize(320, 240);
if1.setClosable(true);
if1.setResizable(true);
if1.setMaximizable(true);
if1.setVisible(true);
JInternalFrame if2 = new JInternalFrame("子窗格2");
if2.setSize(320, 240);
if2.setClosable(true);
if2.setResizable(true);
if2.setMaximizable(true);
if2.setVisible(true);
JDesktopPane dpMain = new JDesktopPane();
dpMain.add(if1);
dpMain.add(if2);
add(dpMain);
setSize(640, 480);
setLocationByPlatform(true);
setTitle("Hello, Swing!");
}
}
代码中,JInternalFrame
其实就是MDI的“虚拟窗体”,它和外部的JFrame
类似,但它完全是由Swing绘制和管理的,而顶层窗体JFrame
则是由Windows操作系统管理的,这里我们设置了JInternalFrame
的大小,以及允许关闭、改变大小和最大化。
运行结果如下图所示。