JAVA实现可设置背景的MDI窗口

简介:
我们都知道,MDI(Multiple Document Interface)即多文档界面。使用MDI窗体时,将在一个父窗体内建立工作区,父窗体能够令一个以上的子窗体限制于其中活动及操作。在office 系列及VS/VS.Net等很多软件中都使用了MDI的表现形式。
   而遗憾的是,虽然很多编程语言都提供了显著的MDI属性,但Java却算是个例外,基本上只能通过JDesktopPane结合JInternalFrame进行实现,而且局限性也比较多。
  其实,利用Swing完成MDI,还有更简单的捷径可循。
  下面,我给出一个简单的例子: 
 
package  org.loon.test;
/**
 * <p>Title: LoonFramework</p>
 * <p>Description:</p>
 * <p>Copyright: Copyright (c) 2007</p>
 * <p>Company: LoonFramework</p>
 * 
@author chenpeng  
 * @email:[email]ceponline@yahoo.com.cn[/email] 
 * 
@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 = 0xdddddd0xaaaaff0xffaaaa0xaaffaa0xffffaa0xffaaff0xaaffff , 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(4444);;
        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(200150));
        
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 == nullreturn;
            
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(800600));
        frame.getContentPane().add(
new JavaMDI());
        frame.setAlwaysOnTop(
true);
        frame.setLocationRelativeTo(
null);
        frame.setVisible(
true);
    }

}




效果图如下:


本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/130102


相关文章
|
缓存 Java Spring
Java本地高性能缓存实践问题之Caffeine中设置刷新机制的问题如何解决
Java本地高性能缓存实践问题之Caffeine中设置刷新机制的问题如何解决
829 1
|
缓存 Java
Java本地高性能缓存实践问题之Caffeine缓存库中基于时间设置驱逐策略的问题如何解决
Java本地高性能缓存实践问题之Caffeine缓存库中基于时间设置驱逐策略的问题如何解决
398 0
|
存储 机器学习/深度学习 监控
如何监控员工的电脑——基于滑动时间窗口的Java事件聚合算法实现探析​
在企业管理场景中,如何监控员工的电脑操作行为是一个涉及效率与合规性的重要课题。传统方法依赖日志采集或屏幕截图,但数据量庞大且实时性不足。本文提出一种基于滑动时间窗口的事件聚合算法,通过Java语言实现高效、低资源占用的监控逻辑,为如何监控员工的电脑提供一种轻量化解决方案。
559 3
|
存储 IDE Java
java设置栈内存大小
在Java应用中合理设置栈内存大小是确保程序稳定性和性能的重要措施。通过JVM参数 `-Xss`,可以灵活调整栈内存大小,以适应不同的应用场景。本文介绍了设置栈内存大小的方法、应用场景和注意事项,希望能帮助开发者更好地管理Java应用的内存资源。
967 4
|
数据采集 算法 Java
如何在Java爬虫中设置动态延迟以避免API限制
如何在Java爬虫中设置动态延迟以避免API限制
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
21398 12
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
568 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
1203 4
|
缓存 负载均衡 安全
|
Java Linux iOS开发
如何设置 Java 的环境变量
设置Java环境变量是使用Java开发工具和运行Java程序的前提。主要步骤包括:安装JDK,配置系统环境变量中的JAVA_HOME、PATH和CLASSPATH,确保命令行可直接调用javac和java命令。
902 6