zoukankan      html  css  js  c++  java
  • Java中MDI的实现

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

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

      代码是简单的,先在主窗体(可是以一个JFrame)中加入一个JDesktopPane,为MDI“提供活动的空间”:
    JDesktopPane desktop = new JDesktopPane ();
    ??.add(desktop);
      这里的??可以是任意的Container,这一点Java就显得很自由,很灵活,可以在很多地方创建这样的一个DesktopPane。
      当然,如果想这个Pane在需要时可以滚动,可以使用常用的技巧,把它加入一个JScrollPane,这里比较特殊,需要重载它的preferredSizeOfAllFrames函数才能获得正确的尺寸,才有正确的滚动效果:
    public class JDesktop extends JDesktopPane
    {
        public 
    void paint(Graphics g)
        {
            super.paint(g);
            Dimension d 
    = preferredSizeOfAllFrames();
            
    this.setPreferredSize(d);
            
    this.revalidate();

        }

      
    /**
       * @return 返回最佳desktop尺寸..
       
    */
        public Dimension preferredSizeOfAllFrames()
        {
            JInternalFrame [] array 
    = getAllFrames();

            
    int maxX = 0;
            
    int maxY = 0;
            
    for (int i = 0; i < array.length; i++)
            {
                
    if ( array[ i ].isVisible() )
                {
                    
    int cx;
                    cx 
    = array[i].getX();
                    
    int x = cx + array[i].getWidth();
                    
    if (x > maxX) maxX = x;
                    
    int cy;
                    cy 
    = array[i].getY();
                    
    int y = cy + array[i].getHeight();
                    
    if (y > maxY) maxY = y;
                }
            }
            
    return new Dimension(maxX, maxY);
        }
    }
    (这是一位网友陈先波的代码)

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

  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/wonderow/p/77210.html
Copyright © 2011-2022 走看看