一般的编程语言都会提供显著的MDI功能,但Java似乎不那么明显,问了一些经常使用Java的同学居然一时也没说上来如何实现。于是借助网络的强大力量,我们知道了在Swing中提供了JDesktopPane和JInternalFrame,结合使用即可实现MDI的效果。
代码是简单的,先在主窗体(可是以一个JFrame)中加入一个JDesktopPane,为MDI“提供活动的空间”:


当然,如果想这个Pane在需要时可以滚动,可以使用常用的技巧,把它加入一个JScrollPane,这里比较特殊,需要重载它的preferredSizeOfAllFrames函数才能获得正确的尺寸,才有正确的滚动效果:






































然后可以往里加入子窗口JInternalFrame了:







具体可以查看JDK的demo/jfc/metaworks例子,或JDK关于JInternalFrame的帮助。