我们都知道,MDI(Multiple Document Interface)即多文档界面。使用MDI窗体时,将在一个父窗体内建立工作区,父窗体能够令一个以上的子窗体限制于其中活动及操作。在office系列及VS/VS.Net等很多软件中都使用了MDI的表现形式。
而遗憾的是,虽然很多编程语言都提供了显著的MDI属性,但Java却算是个例外,基本上只能通过JDesktopPane结合JInternalFrame进行实现,而且局限性也比较多。
其实,利用Swing完成MDI,还有更简单的捷径可循。
下面,我给出一个简单的例子:
packageorg.loon.test;
/***//**
*<p>Title:LoonFramework</p>
*<p>Description:</p>
*<p>Copyright:Copyright(c)2007</p>
*<p>Company:LoonFramework</p>
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
importjavax.imageio.ImageIO;
importjavax.swing.BorderFactory;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JLayeredPane;
importjavax.swing.JPanel;
importjavax.swing.JTextArea;
importjavax.swing.SwingConstants;
importjavax.swing.WindowConstants;
importjavax.swing.border.Border;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.EventQueue;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Insets;
importjava.awt.Point;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.event.MouseMotionListener;
importjava.io.IOException;
publicclassJavaMDIextendsJPanel...{
/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;
privatestaticfinalintBACKLAYER=1;
FontFONT=newFont("宋体",Font.PLAIN,12);
privatefinalBackImagePanelayerPane;
//子窗体背景色
privateint[]colors=...{0xdddddd,0xaaaaff,0xffaaaa,0xaaffaa,0xffffaa,0xffaaff,0xaaffff,0xddddff};
privateColorgetColor(inti,floatf)...{
intb=(int)((i&0xff)*f);
i=i>>8;
intg=(int)((i&0xff)*f);
i=i>>8;
intr=(int)((i&0xff)*f);
returnnewColor(r,g,b);
}
publicJavaMDI()...{
super(newBorderLayout());
Imageimage;
try...{
image=ImageIO.read(getClass().getResource("javamdi.jpg"));
}catch(IOExceptione)...{
image=null;
}
layerPane=newBackImagePane();
layerPane.setImage(image);
//随机生成个子面板,作为内部窗体,实际使用时替换JPanel内部容器即可。
for(inti=0;i<colors.length;i++)...{
JPanelp=createChildPanel(i);
p.setLocation(i*80+20,i*50+15);
layerPane.add(p,BACKLAYER);
}
add(layerPane,BorderLayout.CENTER);
}
/***//**
*创建子面板,作为在内部移动的窗体
*@parami
*@return
*/
privateJPanelcreateChildPanel(inti)...{
//使用html标记设定颜色
Stringhtml="<html><fontcolor=#333333>子窗体ID"+i+"</font></html>";
JLabellabel=newJLabel(html);
label.setFont(FONT);
label.setOpaque(true);
label.setHorizontalAlignment(SwingConstants.CENTER);
//设定背景色
label.setBackground(getColor(colors[i],0.85f));
//设定边距
Borderborder1=BorderFactory.createEmptyBorder(4,4,4,4);;
label.setBorder(border1);
JTextAreatext=newJTextArea();
text.setBackground(newColor(colors[i]));
text.setMargin(newInsets(4,4,4,4));
text.setLineWrap(true);
JPanelp=newJPanel();
Colorcol=getColor(colors[i],0.5f);
Borderborder=BorderFactory.createLineBorder(col,1);
p.setBorder(border);
//移动监听
DragMouseListenerli=newDragMouseListener(p);
p.addMouseListener(li);
p.addMouseMotionListener(li);
p.setLayout(newBorderLayout());
p.add(label,BorderLayout.NORTH);
p.add(text,BorderLayout.CENTER);
//子窗体大小
p.setSize(newDimension(200,150));
returnp;
}
/***//**
*子窗体拖拽监听
*@authorchenpeng
*
*/
classDragMouseListenerimplementsMouseListener,MouseMotionListener...{
Pointorigin;
JPanelpanel;
DragMouseListener(JPanelp)...{
panel=p;
}
publicvoidmousePressed(MouseEvente)...{
origin=newPoint(e.getX(),e.getY());
//移动
layerPane.moveToFront(panel);
}
publicvoidmouseDragged(MouseEvente)...{
if(origin==null)return;
intdx=e.getX()-origin.x;
intdy=e.getY()-origin.y;
Pointp=panel.getLocation();
panel.setLocation(p.x+dx,p.y+dy);
}
publicvoidmouseClicked(MouseEvente)...{}
publicvoidmouseEntered(MouseEvente)...{}
publicvoidmouseExited(MouseEvente)...{}
publicvoidmouseReleased(MouseEvente)...{}
publicvoidmouseMoved(MouseEvente)...{}
}
//用分层面板JLayeredPane制作MDI背景
classBackImagePaneextendsJLayeredPane...{
/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;
publicBackImagePane()...{
super();
}
voidsetImage(Imageimg)...{
bgImage=img;
}
privateImagebgImage;
publicvoidpaint(Graphicsg)...{
if(bgImage!=null)...{
intimageh=bgImage.getHeight(null);
intimagew=bgImage.getWidth(null);
Dimensiond=getSize();
for(inth=0;h<d.getHeight();h+=imageh)...{
for(intw=0;w<d.getWidth();w+=imagew)...{
g.drawImage(bgImage,w,h,this);
}
}
}
super.paint(g);
}
}
publicstaticvoidmain(String[]args)...{
EventQueue.invokeLater(newRunnable()...{
publicvoidrun()...{
createGUI();
}
});
}
publicstaticvoidcreateGUI()...{
finalJFrameframe=newJFrame("JAVA实现可设置背景的MDI窗口");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(newDimension(800,600));
frame.getContentPane().add(newJavaMDI());
frame.setAlwaysOnTop(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
效果图如下:
分享到:
相关推荐
实现MDI窗口通常需要编程语言的支持,如C++、C#或Java,以及相关的图形用户界面库,如Microsoft的MFC(Microsoft Foundation Classes)或Qt。在C++中,MFC库提供了对MDI窗口的支持,包括创建MDI父窗口和子窗口,以及...
这涉及到图形用户界面(GUI)的定制,可能需要使用到颜色选择器控件,并实现相应的颜色设置函数来更新窗口的背景。 6. **资源管理**:在MDI应用中,每个子窗口可能都需要自己的资源,如图像、字体等。开发人员需要...
对于其他编程语言,如Java的Swing或JavaFX,或是Python的Tkinter,更改背景色的方法也会有所不同,但基本思路是一致的:获取或创建相应的组件,然后设置其背景颜色。 在商业软件开发中,更改MDI客户区的背景色可能...
Swing是Java AWT(抽象窗口工具包)的扩展,提供了丰富的组件集,如JFrame(主窗口)、JMenuItem(菜单项)、JButton(按钮)和JTextArea(文本区域)。例如,"另存为"功能可以由一个JMenuItem触发,而"保存"则可能...
子类化MDI窗体可以帮助我们实现自定义的窗口布局,比如更改窗口背景,或者实现特殊的拖放行为。 压缩包内的"Subclass.ocx"可能是一个ActiveX控件,它是Windows应用程序中用于提供特定功能的小型可重用组件。这个...
7. **多文档接口(MDI)**:如果要支持同时编辑多个文件,可以考虑实现MDI,让用户能在同一窗口内切换和管理多个文档。 8. **语法高亮**:为了让代码更易读,可以实现简单的语法高亮功能。这可能需要分析文本中的...
这个简易的Java文本编辑器通过使用Swing组件实现了基本的MDI功能。它不仅提供了文档的打开、关闭、最大化等操作,还通过调整桌面大小的方法确保所有文档窗口都能正确显示。通过深入分析这段代码,可以了解到如何在...
3. **背景**:背景颜色可以是单一颜色,也可以设置为渐变色,以创造出更丰富的视觉体验。渐变色可以通过线性或径向渐变实现,增加界面层次感。 4. **字体尺寸和类型**:选择合适的字体大小和类型可以提升界面的美感...
8. 软件设计模式:文档中提到了MDI(Multiple Documents Interface,多重文档界面),这是Windows应用程序常用的设计模式之一,允许在同一个父窗口内打开多个文档窗口。 综上所述,文件内容虽然受到OCR技术限制,...
通过这些框架,程序员可以绘制球体、显示背景,并设置定时器以控制动画的更新频率。 程序员还需要考虑用户交互。例如,用户可能希望调整球体的初始速度或方向,或者改变界面的显示方式。在MDI程序中,这些操作需要...
1. **界面初始化**:构造函数中,首先创建了文本编辑区域,并设置了窗口的初始位置和大小,确保窗口在屏幕上居中显示。通过`JScrollPane`组件,实现了文本区域的滚动功能。 2. **工具栏设计**:通过`JToolBar`创建...
- JPanel:一个可自定义的组件容器,通常用于组合其他组件或添加背景颜色等。 - JButton:用于创建按钮,可以响应用户的点击事件。 - JLabel:用于显示文本或图像。 - JTextField:用于输入单行文本。 - ...
- `JDesktopPane`:在Java Swing中,用于创建MDI(多文档界面)应用的组件,允许在单个窗口内打开多个子窗口。 - `JInternalFrame`:在`JDesktopPane`中使用的内部帧,可以像独立窗口一样打开、关闭、最大化和最小...
在本例中,使用了JDesktopPane作为桌面面板,它可以承载多个内部窗口(JInternalFrame),提供类似Windows操作系统的多文档界面(MDI)效果。 JTabbedPane是Java Swing中的一个控件,用于实现标签页功能。在进销存...
4. **格式设置**:可能包含字体、字号、字体颜色和背景色的调整选项,虽然原版记事本不支持这些高级格式化功能,但仿制品可能会增加这些增强特性。 5. **编码支持**:处理文本文件时,需要考虑字符编码问题,如支持...
JDesktopPane是一个特殊的容器,常用于实现MDI(多文档界面)应用,允许在一个窗口中嵌套多个子窗口。 此外,界面编程还需要关注用户体验,例如更新或初始化背景图片。这可能涉及到图形用户界面(GUI)的动态更新,...
在Java Swing库中,`JInternalFrame`是一个非常重要的组件,它允许我们在一个主窗口(JDesktopPane)内部创建可移动、可最小化、可关闭的子窗口。这些子窗口通常被称为内部帧,它们提供了类似操作系统级别的窗口管理...
此外,Notepad++支持多文档界面(MDI),允许用户在同一窗口内同时打开并编辑多个文件,方便进行多任务处理。它还具有多标签页的功能,用户可以轻松切换不同文件,避免了窗口混乱的情况。Notepad++还有搜索和替换...
6. **多文档接口(MDI)**:ScintillaNet支持在单个应用程序中管理多个编辑窗口,适合构建多文件编辑器。 7. **括号匹配**:自动检测和高亮显示匹配的括号,帮助用户检查代码的正确性。 8. **错误标记**:可以设置...
在这个场景下,"位图底图"通常是指在MDI窗口的背景上添加一个固定的图像(通常是位图格式),用以增强视觉效果或者提供某种功能基础。 【标签】:“bmp2 zip”标签直接指明了压缩包内可能包含的文件类型,即BMP图像...