所有可以添加组件的组件都可以被称为“容器”,在Swing体系中,窗体可以被称为顶级容器,在顶级容器中还可以创建中间容器并用它们来存放其他组件,程序员也可以对中间容器单独设置布局管理器。Swing体系中,中间容器包括JPanel、JScollPane、JtabbedPane、JToolBar等,本小节将详细讲解中间容器的使用。
【资料图】
在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】运行结果如图
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中可以看出:如果对滚动面板设置了不显示垂直滚动条,那么即使垂直方向不能显示出所有文本,滚动面板也不会出现垂直滚动条。
选项板是由若干个选项卡组成的一个容器,使用选项板可以把各个组件摆放到不同的选项卡中,这样就能把一个窗体从形式上分成了好几部分,从而能够把一个窗体清楚的划分成不同的功能区域,并且还不增加窗体的面积。在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】运行结果
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。