所有可以添加组件的组件都可以被称为“容器”,在Swing体系中,窗体可以被称为顶级容器,在顶级容器中还可以创建中间容器并用它们来存放其他组件,程序员也可以对中间容器单独设置布局管理器。Swing体系中,中间容器包括JPanel、JScollPane、JtabbedPane、JToolBar等,本小节将详细讲解中间容器的使用。
20.6.1面板JPanel
在Swing体系中用JPanel类来表示面板,面板就是一个最常见的中间容器。中间容器用来存放其他组件,其他组件如果放置在面板中时,通过setLocation()方法设置组件位置时,其位置是相对于面板的而不是相当于整个窗体而言的。下面的【例20_19】展示了使用JPanel作为中间容器的效果。
【例20_19 JPanel的使用】
Exam20_19.java
import javax.swing.*;
import java.awt.*;
class Exam20_19Frame extends JFrame{
JPanel jpn1;
JPanel jpn2;
JButton btn1,btn2;
public Exam20_19Frame(){
init();
}
private void init( ){
Container container = this.getContentPane();
container.setLayout(null);
btn1 = new JButton("按钮1");
btn1.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btn1.setSize(100,40);
btn1.setLocation(0,0);
jpn1 = new JPanel(null);
jpn1.setSize(150,80);
jpn1.setLocation(50,50);
jpn1.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
jpn1.add(btn1);
btn2 = new JButton("按钮2");
btn2.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btn2.setSize(100,40);
btn2.setLocation(0,0);
jpn2 = new JPanel(null);
jpn2.setSize(150,80);
jpn2.setLocation(250,50);
jpn2.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
jpn2.setBackground(Color.YELLOW);
jpn2.add(btn2);
container.add(jpn1);
container.add(jpn2);
}
}
public class Exam20_19 {
public static void main(String[] args) {
Exam20_19Frame frame = new Exam20_19Frame();
frame.setSize(500, 250);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_19Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
【例20_19】的运行结果如图20-20所示。
图20-20【例20_19】运行结果如图
20.6.2滚动面板JScrollPane
JScrollPane被称为“滚动面板”,它的主要作用是盛放一些比较大的组件并为之添加滚动条,例如用滚动面板盛放文本区、表格、树形组件等。
JScrollPane作为一个中间容器最主要的就是设置其滚动条显示策略,所谓滚动条显示策略就是规定滚动条在什么情况下被显示。滚动条策略由一个整数来表示,而这些整数都以ScrollPaneConstants类的静态属性来定义。下面的表20-11展示了代表各种滚动条策略的静态属性。
表20-11 JScrollPane滚动条策略
静态属性 | 滚动条策略 |
---|---|
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED | 需要时显示垂直滚动条(默认) |
ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER | 从不显示垂直滚动条 |
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS | 总是显示垂直滚动条 |
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED | 需要时显示水平滚动条(默认) |
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER | 从不显示水平滚动条 |
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS | 总是显示水平滚动条 |
程序员可以通过JScrollPane类的setVerticalScrollBarPolicy()方法来设置滚动面板的垂直滚动条策略,而通过setHorizontalScrollBarPolicy()方法来设置垂直滚动条的策略。下面的【例20_20】展示了JScrollPane设置垂直滚动条策略的几种效果,实际上设置水平滚动条也有同样的效果。
【例20_20 设置垂直滚动条显示策略】
Exam20_20.java
import javax.swing.*;
import java.awt.*;
class Exam20_20Frame extends JFrame{
JTextArea txa1;
JTextArea txa2;
JTextArea txa3;
JScrollPane jsp1;
JScrollPane jsp2;
JScrollPane jsp3;
public Exam20_20Frame(){
init();
}
private void init( ){
Container container = this.getContentPane();//获得窗体的主体区域
container.setLayout(null);
txa1 = new JTextArea();
txa1.setFont(new Font("微软雅黑", Font.PLAIN, 20));
txa1.setLineWrap(true);
jsp1 = new JScrollPane(txa1);
jsp1.setSize(150, 150);
jsp1.setLocation(50, 20);
//设置不显示垂直滚动条
jsp1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
txa2 = new JTextArea();
txa2.setFont(new Font("微软雅黑", Font.PLAIN, 20));
txa2.setLineWrap(true);
jsp2 = new JScrollPane(txa2);
jsp2.setSize(150, 150);
jsp2.setLocation(250, 20);
//设置总是显示垂直滚动条
jsp2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
txa3 = new JTextArea();
txa3.setFont(new Font("微软雅黑", Font.PLAIN, 20));
txa3.setLineWrap(true);
jsp3 = new JScrollPane(txa3);
jsp3.setSize(150, 150);
jsp3.setLocation(450, 20);
//设置需要时显示垂直滚动条
jsp3.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
container.add(jsp1);
container.add(jsp2);
container.add(jsp3);
}
}
public class Exam20_20 {
public static void main(String[] args) {
Exam20_20Frame frame = new Exam20_20Frame();
frame.setSize(680, 250);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_20Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
【例20_20】的运行结果如图20-21所示。
图20-21【例20_20】运行结果
从图20-21中可以看出:如果对滚动面板设置了不显示垂直滚动条,那么即使垂直方向不能显示出所有文本,滚动面板也不会出现垂直滚动条。
20.6.3选项板JTabbedPane
选项板是由若干个选项卡组成的一个容器,使用选项板可以把各个组件摆放到不同的选项卡中,这样就能把一个窗体从形式上分成了好几部分,从而能够把一个窗体清楚的划分成不同的功能区域,并且还不增加窗体的面积。在Swing体系中使用JTabbedPane类来表示选项板。
一个选项板是由多个选项卡组成的,程序员可以根据实际需要来为选项板灵活的添加选项卡。添加选项卡的方法是addTab(),addTab()方法不仅仅能够增加一个选项卡的组件,还可以指定这个选项卡的标题。需要强调:一个选项卡上只能添加一个组件,如果希望在选项卡上添加多个组件,可以先在选项卡上添加一个JPanel面板,然后在该面板上添加多个其他组件。
为了让选项板正确的显示到窗体上,通常情况下都不会把窗体设置为空布局,而是采用窗体的默认布局方式,之后根据需要对每个选项卡上的JPanel面板单独进行布局设置。下面的【例20_21】展示了如何创建一个选项板。
【例20_21 JtabbedPane的使用】
Exam20_21.java
import javax.swing.*;
import java.awt.*;
class Exam20_21Frame extends JFrame{
JTabbedPane tbpMain;
JButton btn1,btn2;
JPanel jpn1;
JPanel jpn2;
public Exam20_21Frame(){
init();
}
private void init( ){
Container container = this.getContentPane();
this.setResizable(false);
tbpMain=new JTabbedPane();
jpn1 = new JPanel(null);
btn1=new JButton("按钮1");
btn1.setSize(100,30);
btn1.setLocation(50, 50);
btn1.setFont(new Font("微软雅黑", Font.PLAIN, 20));
jpn1.add(btn1);
jpn2 = new JPanel(null);
btn2=new JButton("按钮2");
btn2.setSize(100,30);
btn2.setLocation(50, 50);
btn2.setFont(new Font("微软雅黑", Font.PLAIN, 20));
jpn2.add(btn2);
tbpMain.addTab("选项卡一", jpn1);
tbpMain.addTab("选项卡二", jpn2);
container.add(tbpMain);
}
}
public class Exam20_21 {
public static void main(String[] args) {
Exam20_21Frame frame = new Exam20_21Frame();
frame.setSize(300, 350);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_20Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
【例20_21】的运行结果如图20-22所示。
图20-22【例20_21】运行结果