Pane是一类独立的控件,中文通常翻译为窗格。窗格中可以容纳另一个或多个组件,实现滚动条,标签页等效果。
实际上就这个滚动条而言,JScrollPane
设计的就很有争议,因为类似JList
这样的控件,显然应该默认带有滚动条,但是Swing并没有这样设计,JList
必须结合JScrollPane
才能实现滚动条,虽然看上去更符合面向对象的设计规范,但我也觉得这样做有点过度设计,显然给程序员带来了麻烦。
Swing中,有这样几种Pane:JScrollPane
,JTabbedPane
,JSplitPane
,JLayeredPane
,JDesktopPane
。我们这里介绍其中比较常用的几种,Pane的用法基本都相同,需要时查阅文档即可。
JScrollPane用来实现滚动条。我们直接看一个例子:
package com.gacfox.demo;
import javax.swing.*;
public class MyFrame extends JFrame {
public MyFrame() {
JScrollPane jScrollPane = new JScrollPane();
JTextArea jTextArea = new JTextArea();
jScrollPane.setViewportView(jTextArea);
this.add(jScrollPane);
this.pack();
}
}
运行结果:
上面代码只是和JScrollPane
有关的一小部分,但是足以说明问题了。我们创建了一个JTextArea
,但是我们直接使用的话,它是没有滚动条的,因此我们又创建了一个JScrollPane
,将JTextArea
控件添加到JScrollPane
中,当文本框中的数据行数超过其高度时,滚动条就出现了。
void setViewportView(Component view)
这个方法把一个控件添加到JScrollPane
中。除了文本域,所有继承JComponent
的控件也都能使用JScrollPane
。
标签页也比较常用,我们来看标签页的实现代码:
package com.gacfox.demo;
import javax.swing.*;
public class MyFrame extends JFrame {
public MyFrame() {
JTabbedPane jTabbedPane = new JTabbedPane();
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JPanel jPanel3 = new JPanel();
jTabbedPane.addTab("tab1", jPanel1);
jTabbedPane.addTab("tab2", jPanel2);
jTabbedPane.addTab("tab3", jPanel3);
this.add(jTabbedPane);
this.pack();
}
}
运行结果:
上面代码创建了一个JTabbedPane
,然后使用addTab()
函数添加了若干了JPanel
。实际上,我们向标签页添加的组件通常都是JPanel
,因为JPanel
还能容纳其他组件。
void addTab(String title, Component component)
添加标签,第一个参数是标签的名字,第二个参数是标签页的组件。这里所说的虚拟桌面窗格在其它GUI框架中一般叫MDI,JDesktopPane
配合JInternalFrame
就是Swing中的MDI实现。JDesktopPane
实际上是在JLayeredPane
基础上实现的,后者应用较少,我们这里直接介绍JDesktopPane
。
下面代码中,我们创建了JDesktopPane
,并添加了两个JInternalFrame
。
package com.gacfox.demo;
import java.awt.Dimension;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
public class MyFrame extends JFrame {
public MyFrame() {
JInternalFrame internalFrame1 = new JInternalFrame("子窗格1");
internalFrame1.setSize(320, 240);
internalFrame1.setVisible(true);
JInternalFrame internalFrame2 = new JInternalFrame("子窗格2");
internalFrame2.setSize(320, 240);
internalFrame2.setVisible(true);
JDesktopPane jDesktopPane = new JDesktopPane();
jDesktopPane.add(internalFrame1);
jDesktopPane.add(internalFrame2);
add(jDesktopPane);
setSize(new Dimension(640, 480));
}
}
运行结果: