在Java MDI窗口中加入滚动条

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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窗口中实现滚动条了

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航