Swing实现多文档界面(MDI)应用程序

67 篇文章 16 订阅

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);
	}
}

运行主窗体:

 

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值