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: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);
    }
}


效果图如下:

posted on 2007-12-26 16:47 cping 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/cping1982/archive/2007/12/26/2258076.html

JAVA实现可设置背景的MDI窗口相关推荐

  1. Java——文本框设置背景颜色、字体样式和颜色

    ┏(ω)=☞ 本专栏的目录(为您提供更好的查询方式)(点这里说不定有你想要的) 字体风格一共有四种,分别是 Font.PLAIN(普通) Font.BOLD(加粗) Font.ITALIC(斜体) F ...

  2. java图标中设置背景、文本框设置大小、标签中字体的格式

    ImageIcon icon = new ImageIcon("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\小.jpg");dayBt ...

  3. java给frame设置背景_JAVA设置FRAME背景总结设置背景图片

    Java中有关Frame背景的设置总结 我们在进行图形用户界面编程时,为了做出一个漂亮.个性化的界面,那么界面的背景就必须考虑了.要想灵活使用背景,就一定要对frame的基本有一些了解,因为在java ...

  4. html 页面宽度和背景颜色,CSS:设置背景颜色为窗口宽度的50%

    旧版浏览器支持 如果旧的浏览器支持是必须的,所以你不能去使用多个背景或渐变,你可能要在备用的div元素上做这样的事情: #background { position: fixed; top: 0; l ...

  5. 简单东西-java动态更改JLabel背景图片

    java的awt设置背景图片的一种方式是使用JLabel类,它的setIcon可以设置背景图片,但是如何动态修改背景图片呢?这源于问答频道上的一个问题,题主给的代码总是无法正确动态修改背景图片,找了一 ...

  6. MFC设置背景图片之三(使用GDI+)

    前言 前面提及到两种方法可以设置MFC背景图片,操作由简到难,当然了他们的适用情况及功能性也是由简到繁的,这次使用的方法基本能满足任何功能需求,使用GDI+加载的背景图片可随窗口大小缩放 添加头文件 ...

  7. java图形界面编程如何给窗口设置背景图片

    文章目录 前言 一.知识点介绍 二.代码实现 总结 前言 相信大家在GUI编程过程中,也就是开发窗口程序过程中,比如游戏界面等,难免会需要给窗口添加背景图片,接下来我将给大家详细讲解如何给窗口设置背景 ...

  8. java JFrame 设置背景颜色无效的理解

    广州疯狂软件教育Java培训,iOS培训分享 在开发Java应用程序时,通常情况下利用JFrame创建窗口.利用JFrame创建的窗口分别包含一个标题.最小化按钮.最大化按钮和关闭按钮 1.在你使用J ...

  9. JAVA下GUI设置透明背景图片窗口(不覆盖文本内容)

    之前学过Java的GUI,写过简单的例子.昨天朋友问怎么能为窗口设置背景图片,且让文字在背景上边显示,挺简单的要求折腾了好一会儿才实现-mark一下. 一.最终效果图: 二.源码 public cla ...

最新文章

  1. datanucleus mysql_DataNucleus Access Platform 3.1.2发布
  2. log4cplus的内存泄露问题
  3. Linux入门(10)——Ubuntu16.04使用pip3和pip安装numpy,scipy,matplotlib等第三方库
  4. python数值计算
  5. 【图论】【启发式搜索】【二分查找】[POJ 3897]Maze Stretching
  6. WCF使用Json传输的一个BUG
  7. Windows Live Writer
  8. Waymo无人驾驶出租车上线:科技感爆棚,还比Uber便宜
  9. 系统分析师考试大纲2009
  10. 1. 虚拟化Docker
  11. css选择文件的图片大小,怎么用css设置图片大小
  12. 集合论—集合的基本运算与主要算律
  13. 如何在谷歌上搜索: 31个 Google 高级搜索技巧
  14. Windows 7 登录界面背景图片定制
  15. 梦幻西游手游服务器维护公告,《梦幻西游手游》10月5日维护公告 部分区服合并...
  16. PAT甲级 A1031
  17. spring 代码执行 (CVE-2018-1273)
  18. Java/171. Excel Sheet Column Number Excel序号转换数字
  19. 展会中,你做得够好么?
  20. 微软Project Server 2016正式版下载:支持项目组合管理-搜狐

热门文章

  1. 为什么spark没有java的交互模式?
  2. chmod 777后还是无法写入
  3. sublime unable to save 没有那个文件或者目录
  4. 多进程fork()函数
  5. 【数学基础】参数估计之极大似然估计
  6. 项羽java_Java中高级面试题
  7. Edge on Linux?微软:会有的,但不是现在
  8. 观察+|腾讯网易终获游戏版号,但all in 游戏时代已结束
  9. eclipse中anroid adk添加
  10. SpringBoot2.x开发案例之整合Quartz任务管理系统