在Java中使用MDI的处理模式,其中的JDesktopPane和JInternalFrame已经为我们实现了这样的功能。但是,在将JInternalFrame最大化的时候,JDesktopPane和我们熟知的其他软件,如Photoshop等,具有不同的处理方式。此时可以通过这里介绍的内容弥补这一缺点,使Swing的程序更类似于本地实现。
首先先看一下怎么使用JDesktopPane和JInternalFrame实现MDI。其实实现的方式很简单,就是在一个窗口中添加JDesktopPane,然后使用JDesktopPane的add方法,添加JInternalFrame的实例即可。具体的代码片段如下所示:
由此即可按照Java提供的方式添加MDI的实现。我们可以看到它的运行截图如下所示:
可以看到,当JInternalFrame最大化的时候,仅仅是充满了整个JDesktopPane,并不会像一般的MDI程序一样,将最大化最小化的按钮显示在菜单栏。这是因为JInternalFrame是一个轻量级组件,必须依附在容器之中,因此它的大小不可能超出JDesktopPane。为了获得我们想要的效果,我们希望对JInternalFrame的最大化事件进行监听,但奇怪的是,Java并没有提供类似的事件。于是,我们做了一下变通:由于JInternalFrame继承自JComponent,而JComponent有一个componentResized方法,可以监听组件自身的大小的变化。这样,我们沿着这个思路,就可以进行如下的编写了: