/**
* @(#)InternalFrameTest.java
*/
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.awt.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
/**
* 多功能窗口主窗体架构类,主函数入口<br>
* <br>
* InternalFrameTest 主窗口程序
*<br>
* <br>
* 刘彬 写于 2008年6月16日
*
* @author 刘彬
* @version 1.00 2008/6/16
*/
public class InternalFrameTest
{
public static void main(String[] args)
{
JFrame frame = new DesktopFrame();
frame.setVisible(true);
}
}
/**
* 多功能窗口主窗体架构类,主函数入口
* Desktop,用于加入各种功能的窗口,支持窗口操作
*/
class DesktopFrame extends JFrame
implements ActionListener, VetoableChangeListener
{
/**
* 构造出桌面,大小,窗口置于屏幕中心,设置窗口图标
*/
public DesktopFrame()
{
setTitle("多功能窗口");
setSize(1200, 700);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
} );
desktop = new JDesktopPane();
setContentPane(desktop);
// set up menus
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("文件");
menuBar.add(fileMenu);
openImageItem = new JMenuItem("打开图片");
openImageItem.addActionListener(this);
fileMenu.add(openImageItem);
openWebItem = new JMenuItem("打开html文件");
openWebItem.addActionListener(this);
fileMenu.add(openWebItem);
openTextItem = new JMenuItem("打开文本文档");
openTextItem.addActionListener(this);
fileMenu.add(openTextItem);
openDrawItem = new JMenuItem("简易绘图");
openDrawItem.addActionListener(this);
fileMenu.add(openDrawItem);
exitItem = new JMenuItem("Exit");
exitItem.addActionListener(this);
fileMenu.add(exitItem);
JMenu windowMenu = new JMenu("窗口管理");
menuBar.add(windowMenu);
nextItem = new JMenuItem("下一张");
nextItem.addActionListener(this);
windowMenu.add(nextItem);
cascadeItem = new JMenuItem("层叠");
cascadeItem.addActionListener(this);
windowMenu.add(cascadeItem);
tileItem = new JMenuItem("平铺");
tileItem.addActionListener(this);
windowMenu.add(tileItem);
dragOutlineItem = new JCheckBoxMenuItem("托放");
dragOutlineItem.addActionListener(this);
windowMenu.add(dragOutlineItem);
}
/**
* 构造图像处理窗口
* @param c 包含的组件,这里是desktop
* @param t 图片路径
*/
public void createInternalFrame_image(Component c, String t)
{
iframe = new ImageProcessingFrame(c , t);
desktop.add(iframe);
// add listener to confirm frame closing
iframe.addVetoableChangeListener(this);
// position frame
int width = desktop.getWidth() *2/3;
int height = desktop.getHeight() *2/3;
iframe.reshape(nextFrameX, nextFrameY, width, height);
iframe.setVisible(true);
try
{
iframe.setSelected(true);
}
catch(PropertyVetoException e)
{}
if (frameDistance == 0)
frameDistance = iframe.getHeight()
- iframe.getContentPane().getHeight();
// compute placement for next frame
nextFrameX += frameDistance;
nextFrameY += frameDistance;
if (nextFrameX + width > desktop.getWidth())
nextFrameX = 0;
if (nextFrameY + height > desktop.getHeight())
nextFrameY = 0;
}
/**
* 构造HTML浏览窗口
* @param c 包含的组件,这里是desktop
* @param t 文件路径
*/
public void createInternalFrame_html(Component c, String t)
{
JInternalFrame iframe = new JInternalFrame(t,
true, // resizable
true, // closable
true, // maximizable
true); // iconifiable
iframe.getContentPane().add(c);
desktop.add(iframe);
iframe.setFrameIcon(new ImageIcon("document.gif"));
// add listener to confirm frame closing
iframe.addVetoableChangeListener(this);
// position frame
int width = desktop.getWidth() / 2;
int height = desktop.getHeight() / 2;
iframe.reshape(nextFrameX, nextFrameY, width, height);
iframe.show();
// select the frame--might be vetoed
try
{ iframe.setSelected(true);
}
catch(PropertyVetoException e)
{}
/* if this is the first time, compute distance between
cascaded frames
*/
if (frameDistance == 0)
frameDistance = iframe.getHeight()
- iframe.getContentPane().getHeight();
// compute placement for next frame
nextFrameX += frameDistance;
nextFrameY += frameDistance;
if (nextFrameX + width > desktop.getWidth())
nextFrameX = 0;
if (nextFrameY + height > desktop.getHeight())
nextFrameY = 0;
}
/**
* 构造图形绘制窗口
* @param c 包含的组件,这里是desktop
*/
public void createInternalFrame_draw(Component c)
{
sframe = new ShapeTestFrame(c);
desktop.add(sframe);
// add listener to confirm frame closing
sframe.addVetoableChangeListener(this);
// position frame
int width = desktop.getWidth() *2/3;
int height = desktop.getHeight() *2/3;
sframe.reshape(nextFrameX, nextFrameY, width, height);
sframe.setVisible(true);
// select the frame--might be vetoed
try
{
sframe.setSelected(true);
}
catch(PropertyVetoException e)
{}
if (frameDistance == 0)
frameDistance = sframe.getHeight()
- sframe.getContentPane().getHeight();
// compute placement for next frame
nextFrameX += frameDistance;
nextFrameY += frameDistance;
if (nextFrameX + width > desktop.getWidth())
nextFrameX = 0;
if (nextFrameY + height > desktop.getHeight())
nextFrameY = 0;
}
/**
* 构造文本编辑窗口
*/
public void createInternalFrame_Text()
{
tframe = new TextEditorFrame();
desktop.add(tframe);
tframe.addVetoableChangeListener(this);
int width = desktop.getWidth() *2/3;
int height = desktop.getHeight() *2/3;
tframe.reshape(nextFrameX, nextFrameY, width, height);
tframe.setVisible(true);
// select the frame--might be vetoed
try
{
tframe.setSelected(true);
}
catch(PropertyVetoException e)
{}
/**
* 如果第一次计算,酸楚层叠窗口间的距离
*/
if (frameDistance == 0)
frameDistance = tframe.getHeight()
- tframe.getContentPane().getHeight();
// compute placement for next frame
nextFrameX += frameDistance;
nextFrameY += frameDistance;
if (nextFrameX + width > desktop.getWidth())
nextFrameX = 0;
if (nextFrameY + height > desktop.getHeight())
nextFrameY = 0;
}
/**
* 层叠显示窗口
*/
public void cascadeWindows()
{
JInternalFrame[] frames = desktop.getAllFrames();