Pane窗格

Swing中Pane是一类相对独立的控件,中文通常翻译为“窗格”。窗格中可以容纳另一个或多个控件,实现滚动条、标签页等效果。Swing中,有这样几种Pane:JScrollPaneJTabbedPaneJSplitPaneJLayeredPaneJDesktopPane。我们这里介绍其中比较常用的几种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的大小,以及允许关闭、改变大小和最大化。

运行结果如下图所示。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。