MDI,Multiple Document Interface(多文档界面)与SDI相对,应用也很广泛。像Word XP以前的版本都是用MDI(之后的版本应该也算MDI,但形式有些不同,看起来像SDI),VS/VS.Net等很多软件也都是MDI,其方便显而易见,即可以在一个窗体中的有限空间里提供多个文档同时编辑使用的功能。

  一般的编程语言都会提供显著的MDI功能,但Java似乎不那么明显,问了一些经常使用Java的同学居然一时也没说上来如何实现。于是借助网络的强大力量,我们知道了在Swing中提供了JDesktopPane和JInternalFrame,结合使用即可实现MDI的效果。

  代码是简单的,先在主窗体(可是以一个JFrame)中加入一个JDesktopPane,为MDI“提供活动的空间”:
Java中MDI的实现JDesktopPane desktop = new JDesktopPane ();
Java中MDI的实现
??.add(desktop);
  这里的??可以是任意的Container,这一点Java就显得很自由,很灵活,可以在很多地方创建这样的一个DesktopPane。
  当然,如果想这个Pane在需要时可以滚动,可以使用常用的技巧,把它加入一个JScrollPane,这里比较特殊,需要重载它的preferredSizeOfAllFrames函数才能获得正确的尺寸,才有正确的滚动效果:
Java中MDI的实现public class JDesktop extends JDesktopPane
Java中MDI的实现{
Java中MDI的实现    public 
void paint(Graphics g)
Java中MDI的实现    {
Java中MDI的实现        super.paint(g);
Java中MDI的实现        Dimension d 
= preferredSizeOfAllFrames();
Java中MDI的实现        
this.setPreferredSize(d);
Java中MDI的实现        
this.revalidate();
Java中MDI的实现
Java中MDI的实现    }
Java中MDI的实现
Java中MDI的实现  
/**
Java中MDI的实现   * @return 返回最佳desktop尺寸..
Java中MDI的实现   
*/
Java中MDI的实现    public Dimension preferredSizeOfAllFrames()
Java中MDI的实现    {
Java中MDI的实现        JInternalFrame [] array 
= getAllFrames();
Java中MDI的实现
Java中MDI的实现        
int maxX = 0;
Java中MDI的实现        
int maxY = 0;
Java中MDI的实现        
for (int i = 0; i < array.length; i++)
Java中MDI的实现        {
Java中MDI的实现            
if ( array[ i ].isVisible() )
Java中MDI的实现            {
Java中MDI的实现                
int cx;
Java中MDI的实现                cx 
= array[i].getX();
Java中MDI的实现                
int x = cx + array[i].getWidth();
Java中MDI的实现                
if (x > maxX) maxX = x;
Java中MDI的实现                
int cy;
Java中MDI的实现                cy 
= array[i].getY();
Java中MDI的实现                
int y = cy + array[i].getHeight();
Java中MDI的实现                
if (y > maxY) maxY = y;
Java中MDI的实现            }
Java中MDI的实现        }
Java中MDI的实现        
return new Dimension(maxX, maxY);
Java中MDI的实现    }
Java中MDI的实现}
Java中MDI的实现
(这是一位网友陈先波的代码)

  然后可以往里加入子窗口JInternalFrame了:
Java中MDI的实现JInternalFrame frame = new ??();
Java中MDI的实现desktop.add(frame);
Java中MDI的实现
try{
Java中MDI的实现frame.setVisible(
true);
Java中MDI的实现frame.setSelected(
true);
Java中MDI的实现}
catch(java.beans.PropertyVetoException ex){}
Java中MDI的实现
  这里的??可以是任何继承JInternalFrame的类。
  具体可以查看JDK的demo/jfc/metaworks例子,或JDK关于JInternalFrame的帮助。

相关文章: