沙漠中的魚

          欲上天堂,先下地獄
          posts - 0, comments - 56, trackbacks - 0, articles - 119
            BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

          在JavaMDI窗口中加入滾動條

          Posted on 2008-09-07 01:14 沙漠中的魚 閱讀(313) 評論(0)  編輯  收藏 所屬分類: Java

          Java設計MDI窗口,要用到JDesktopPane類和JInternalFrame類,其應用可以看jdk自帶的metaworks的例子。但用它實現的MDI窗口在子窗口移出父窗口時,沒有滾動條,為此必借助于JScrollPane才行,如下:

                  JDesktopPane desktop = new JDesktopPane ();
          .
                  JScrollPane scrollpane = new JScrollPane(desktop,
                          JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                          JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                  getContentPane().add(scrollpane);

          但是一運行,但內部窗口移出到邊界外邊時,我們預想中的滾動條并沒有出現,怎么辦?原來,JDesktopPane 加到JScrollPane后其大小就只是JScrollPane的viewport的大小,所以滾動條并沒有出現。所以我們要想辦法讓JDesktopPane 的Viewport的大小跟隨內部窗口的位置而改變大小,繼承一個JDesktopPane 吧:

          /**
           * @author Turbo Chen
           * @version 1.01
           */
          import javax.swing.*;
          import java.awt.*;
          import java.awt.event.*;

          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);
              }
          }
          關鍵是preferredSizeOfAllFrames()方法,子窗口移動時造成JDesktop的刷新,它調用preferredSizeOfAllFrames()方法重新計算最佳JDesktop的大小,并通過revalidate()方法來通知它的上層容器即JScrollPane,JScrollPane會根據JDesktop的大小來調整自身Viewport的大小,當Viewport的大小超出可視范圍,JScrollPane就出現滾動條了.

          在你的程序中,只要用這個新的JDesktop類,就可以在MDI窗口中實現滾動條了

           

          主站蜘蛛池模板: 洛浦县| 额尔古纳市| 潢川县| 牡丹江市| 七台河市| 五大连池市| 石棉县| 聂荣县| 衡山县| 革吉县| 阿克| 历史| 准格尔旗| 崇信县| 富源县| 上思县| 临沧市| 霍邱县| 高平市| 石嘴山市| 长阳| 乌什县| 古田县| 延安市| 滕州市| 吉木萨尔县| 桃园县| 即墨市| 库尔勒市| 巴塘县| 偏关县| 云安县| 孟连| 平谷区| 枣阳市| 万盛区| 大荔县| 班戈县| 三穗县| 黔西县| 临邑县|