1、桌面面板和内部窗体
通常情况下,在一个GUI应用程序中需要使用多个窗体,针对多窗体的应用程序,Swing提供了JDesktopPane类和JInternalFrame类(分别称为桌面面板类和内部窗体类)来实现多文档界面(MDI)应用程序。
1.1 JDesktopPane桌面面板类
JDesktopPane类是一个容器类,用来创建一个虚拟的桌面。JDesktopPane类中的常用方法如下:
方法 | 说明 |
---|---|
getAllFrames() | 以数组的形式返回桌面中当前显示的所有 JInternalFrame。 |
getSelectedFrame() | 获取桌面中当前被选中的 JInternalFrame,如果没有被选中的 JInternalFrame,则返回null。 |
removeAll() | 从桌面中移除所有的 JInternalFrame。 |
remove(int index) | 从桌面中移除位于指定索引的 JInternalFrame。 |
setSelectedFrame(JInternalFrame f) | 设置指定的 JInternalFrame为当前被选中的窗体。 |
setDragMode(int dragMode) | 设置桌面窗格使用的“拖动样式”。 |
1.2 JInternalFrame内部窗体类
JInternalFrame类是一个轻量级对象。用来创建支持拖动,关闭,图标化、调整大小、标题显示和菜单栏的内部窗体,该内部窗体需要显示在由JDesktopPane类创建的桌面面板中。JInternalFrame类中常用方法:
方法 | 说明 |
---|---|
setResizable(boolean b) | 设置是否允许自由调整窗体大小。 |
setClosable(boolean b) | 设置是否提供“关闭”按钮。 |
setMaximizable(boolean b) | 设置是否提供“最大化”按钮。 |
setIconifiable(boolean b) | 设置是否提供“最小化”按钮。 |
setSelected(boolean selected) | 设置窗体是否被激活,设置为 true表示激活窗体,设为 false(为默认值)则表示不激活窗体。 |
isMaximum() | 查看窗体是否处于最大化状态。 |
isIcon() | 查看窗体是否处于最小化状态。 |
2、实现多文档界面(MDI)应用程序
注意:为了提高开发效率,本示例中使用的Eclipse已安装WindowBuilder可视化工具。
2.1 创建系统桌面窗体(主窗体)
(1)创建Java项目,然后添加一个窗体应用(Application Window),并命名为MainFrame.java。如下图:
(2)在工具栏中选择JDesktopPane面板,并添加到主窗体中。如下图:
(3)给JDesktopPane面板添加背景图片和实现加载子窗体。
系统桌面窗体(主窗体)的完整代码:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.beans.PropertyVetoException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* 桌面窗体
*
* @author pan_junbiao
*
*/
public class MainFrame
{
private JFrame frame;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
MainFrame window = new MainFrame();
window.frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}
public MainFrame()
{
initialize();
}
private void initialize()
{
// 初始化窗体
frame = new JFrame();
frame.setTitle("系统桌面");
frame.setBounds(100, 100, 603, 434);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null); // 窗体居中
// 在窗体中添加JDesktopPane桌面面板
JDesktopPane desktopPane = new JDesktopPane();
frame.getContentPane().add(desktopPane, BorderLayout.CENTER);
// 设置JDesktopPane桌面面板的背景图片
URL resource = this.getClass().getResource("/bg.jpg"); // 获取背景图片路径
ImageIcon icon = new ImageIcon(resource); // 创建背景图片对象
JLabel backLabel = new JLabel(); // 创建一个标签组件对象
backLabel.setIcon(icon);// 设置标签组件要显示的图标
backLabel.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());// 设置组件的显示位置及大小
desktopPane.add(backLabel); // 将背景组件添加到JDesktopPane桌面面板中
desktopPane.setLayer(backLabel, -1); // 设置背景图片组件的层次(最下方)
// 加载JInternalFrame内部窗体
ChildFrame childFrame = new ChildFrame(); // 创建内部窗体对象
childFrame.setBounds(135, 80, childFrame.getWidth(), childFrame.getHeight()); // 设置内部窗体加载位置及大小
childFrame.setVisible(true); // 设置内部窗体可见
desktopPane.add(childFrame); // 将内部窗体添加到JDesktopPane桌面面板中
try
{
// 选中该内部窗体
childFrame.setSelected(true);
} catch (PropertyVetoException e1)
{
e1.printStackTrace();
}
}
}
2.2 创建内部窗体(子窗体)
(1)创建内部窗体,并将窗体命名为ChildFrame.java。如下图:
(2)内部窗体(子窗体)的完整代码。
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
/**
* 子窗体
*
* @author pan_junbiao
*
*/
public class ChildFrame extends JInternalFrame
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
ChildFrame frame = new ChildFrame();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}
public ChildFrame()
{
setTitle("内部窗体"); // 设置内部窗体的标题
setResizable(true); // 设置允许自由调整窗体大小
setClosable(true); // 设置提供“关闭”按钮
setIconifiable(true); // 设置提供“最小化”按钮
setMaximizable(true); // 设置提供“最大化”按钮
setBounds(100, 100, 340, 218);
getContentPane().setLayout(null);
JLabel label = new JLabel("这是内部窗体");
label.setFont(new Font("宋体", Font.PLAIN, 18));
label.setBounds(92, 74, 131, 39);
getContentPane().add(label);
}
}
运行主窗体: