第二十章《Java Swing》第6节:中间容器

  • Post author:
  • Post category:java

所有可以添加组件的组件都可以被称为“容器”,在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】运行结果

除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!


版权声明:本文为shalimu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。