JAVA实现可设置背景的MDI窗口
而遗憾的是,虽然很多编程语言都提供了显著的MDI属性,但Java却算是个例外,基本上只能通过JDesktopPane结合JInternalFrame进行实现,而且局限性也比较多。
其实,利用Swing完成MDI,还有更简单的捷径可循。
下面,我给出一个简单的例子:
/** *//**
* <p>Title: LoonFramework</p>
* <p>Description:</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company: LoonFramework</p>
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.border.Border;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;
public class JavaMDI extends JPanel ...{
/** *//**
*
*/
private static final long serialVersionUID = 1L;
private static final int BACKLAYER = 1;
Font FONT = new Font("宋体", Font.PLAIN, 12);
private final BackImagePane layerPane;
//子窗体背景色
private int[] colors = ...{ 0xdddddd, 0xaaaaff, 0xffaaaa, 0xaaffaa, 0xffffaa, 0xffaaff, 0xaaffff , 0xddddff};
private Color getColor(int i, float f) ...{
int b = (int)((i & 0xff) * f);
i = i >> 8;
int g = (int)((i & 0xff) * f);
i = i >> 8;
int r = (int)((i & 0xff) * f);
return new Color(r,g,b);
}
public JavaMDI() ...{
super(new BorderLayout());
Image image;
try ...{
image = ImageIO.read(getClass().getResource("javamdi.jpg"));
} catch (IOException e) ...{
image=null;
}
layerPane = new BackImagePane();
layerPane.setImage(image);
//随机生成个子面板,作为内部窗体,实际使用时替换JPanel内部容器即可。
for (int i=0; i<colors.length; i++) ...{
JPanel p = createChildPanel(i);
p.setLocation(i*80 + 20, i*50 + 15);
layerPane.add(p, BACKLAYER);
}
add(layerPane, BorderLayout.CENTER);
}
/** *//**
* 创建子面板,作为在内部移动的窗体
* @param i
* @return
*/
private JPanel createChildPanel(int i) ...{
//使用html标记设定颜色
String html = "<html><font color=#333333> 子窗体ID "+ i +"</font></html>";
JLabel label = new JLabel(html);
label.setFont(FONT);
label.setOpaque(true);
label.setHorizontalAlignment(SwingConstants.CENTER);
//设定背景色
label.setBackground(getColor(colors[i], 0.85f));
//设定边距
Border border1 = BorderFactory.createEmptyBorder(4, 4, 4, 4);;
label.setBorder(border1);
JTextArea text = new JTextArea();
text.setBackground( new Color(colors[i]));
text.setMargin(new Insets(4,4,4,4));
text.setLineWrap(true);
JPanel p = new JPanel();
Color col = getColor(colors[i], 0.5f);
Border border = BorderFactory.createLineBorder(col, 1);
p.setBorder(border);
//移动监听
DragMouseListener li = new DragMouseListener(p);
p.addMouseListener(li);
p.addMouseMotionListener(li);
p.setLayout( new BorderLayout());
p.add(label, BorderLayout.NORTH);
p.add(text, BorderLayout.CENTER);
//子窗体大小
p.setSize( new Dimension(200, 150));
return p;
}
/** *//**
* 子窗体拖拽监听
* @author chenpeng
*
*/
class DragMouseListener implements MouseListener, MouseMotionListener ...{
Point origin;
JPanel panel;
DragMouseListener(JPanel p) ...{
panel = p;
}
public void mousePressed(MouseEvent e) ...{
origin = new Point( e.getX(), e.getY());
//移动
layerPane.moveToFront(panel);
}
public void mouseDragged(MouseEvent e) ...{
if (origin == null) return;
int dx = e.getX() - origin.x;
int dy = e.getY() - origin.y;
Point p = panel.getLocation();
panel.setLocation( p.x + dx, p.y + dy);
}
public void mouseClicked(MouseEvent e) ...{}
public void mouseEntered(MouseEvent e) ...{}
public void mouseExited(MouseEvent e) ...{}
public void mouseReleased(MouseEvent e) ...{}
public void mouseMoved(MouseEvent e) ...{}
}
//用分层面板JLayeredPane制作MDI背景
class BackImagePane extends JLayeredPane ...{
/** *//**
*
*/
private static final long serialVersionUID = 1L;
public BackImagePane() ...{
super();
}
void setImage(Image img) ...{
bgImage = img;
}
private Image bgImage;
public void paint(Graphics g) ...{
if (bgImage != null) ...{
int imageh = bgImage.getHeight(null);
int imagew = bgImage.getWidth(null);
Dimension d = getSize();
for(int h=0; h<d.getHeight(); h += imageh) ...{
for(int w=0; w<d.getWidth(); w += imagew) ...{
g.drawImage(bgImage, w, h, this);
}
}
}
super.paint(g);
}
}
public static void main(String[] args) ...{
EventQueue.invokeLater(new Runnable() ...{
public void run() ...{
createGUI();
}
});
}
public static void createGUI() ...{
final JFrame frame = new JFrame("JAVA实现可设置背景的MDI窗口");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(new Dimension(800, 600));
frame.getContentPane().add(new JavaMDI());
frame.setAlwaysOnTop(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
效果图如下:
转载于:https://www.cnblogs.com/cping1982/archive/2007/12/26/2258076.html
JAVA实现可设置背景的MDI窗口相关推荐
- Java——文本框设置背景颜色、字体样式和颜色
┏(ω)=☞ 本专栏的目录(为您提供更好的查询方式)(点这里说不定有你想要的) 字体风格一共有四种,分别是 Font.PLAIN(普通) Font.BOLD(加粗) Font.ITALIC(斜体) F ...
- java图标中设置背景、文本框设置大小、标签中字体的格式
ImageIcon icon = new ImageIcon("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\小.jpg");dayBt ...
- java给frame设置背景_JAVA设置FRAME背景总结设置背景图片
Java中有关Frame背景的设置总结 我们在进行图形用户界面编程时,为了做出一个漂亮.个性化的界面,那么界面的背景就必须考虑了.要想灵活使用背景,就一定要对frame的基本有一些了解,因为在java ...
- html 页面宽度和背景颜色,CSS:设置背景颜色为窗口宽度的50%
旧版浏览器支持 如果旧的浏览器支持是必须的,所以你不能去使用多个背景或渐变,你可能要在备用的div元素上做这样的事情: #background { position: fixed; top: 0; l ...
- 简单东西-java动态更改JLabel背景图片
java的awt设置背景图片的一种方式是使用JLabel类,它的setIcon可以设置背景图片,但是如何动态修改背景图片呢?这源于问答频道上的一个问题,题主给的代码总是无法正确动态修改背景图片,找了一 ...
- MFC设置背景图片之三(使用GDI+)
前言 前面提及到两种方法可以设置MFC背景图片,操作由简到难,当然了他们的适用情况及功能性也是由简到繁的,这次使用的方法基本能满足任何功能需求,使用GDI+加载的背景图片可随窗口大小缩放 添加头文件 ...
- java图形界面编程如何给窗口设置背景图片
文章目录 前言 一.知识点介绍 二.代码实现 总结 前言 相信大家在GUI编程过程中,也就是开发窗口程序过程中,比如游戏界面等,难免会需要给窗口添加背景图片,接下来我将给大家详细讲解如何给窗口设置背景 ...
- java JFrame 设置背景颜色无效的理解
广州疯狂软件教育Java培训,iOS培训分享 在开发Java应用程序时,通常情况下利用JFrame创建窗口.利用JFrame创建的窗口分别包含一个标题.最小化按钮.最大化按钮和关闭按钮 1.在你使用J ...
- JAVA下GUI设置透明背景图片窗口(不覆盖文本内容)
之前学过Java的GUI,写过简单的例子.昨天朋友问怎么能为窗口设置背景图片,且让文字在背景上边显示,挺简单的要求折腾了好一会儿才实现-mark一下. 一.最终效果图: 二.源码 public cla ...
最新文章
- datanucleus mysql_DataNucleus Access Platform 3.1.2发布
- log4cplus的内存泄露问题
- Linux入门(10)——Ubuntu16.04使用pip3和pip安装numpy,scipy,matplotlib等第三方库
- python数值计算
- 【图论】【启发式搜索】【二分查找】[POJ 3897]Maze Stretching
- WCF使用Json传输的一个BUG
- Windows Live Writer
- Waymo无人驾驶出租车上线:科技感爆棚,还比Uber便宜
- 系统分析师考试大纲2009
- 1. 虚拟化Docker
- css选择文件的图片大小,怎么用css设置图片大小
- 集合论—集合的基本运算与主要算律
- 如何在谷歌上搜索: 31个 Google 高级搜索技巧
- Windows 7 登录界面背景图片定制
- 梦幻西游手游服务器维护公告,《梦幻西游手游》10月5日维护公告 部分区服合并...
- PAT甲级 A1031
- spring 代码执行 (CVE-2018-1273)
- Java/171. Excel Sheet Column Number Excel序号转换数字
- 展会中,你做得够好么?
- 微软Project Server 2016正式版下载:支持项目组合管理-搜狐