`
javayestome
  • 浏览: 1040629 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

构建不规则窗体

阅读更多

在开发一个新浪微博客Swing户端的过程中希望能展现不规则的窗体界面,原来JDK 6 update 10提供了创建指定形状窗体的特性,简单易用,记于此处。(2010.05.31最后更新)

Java从JDK 6 update 10开 始将内建支持构建指定形状的窗体,类com.sun.awt.AWTUtilities中的方法setWindowShape会根据不同的Shape实现 去构造相应形状的窗体。AWTUtilities类是放在SUN的包中,在使用该方法时应该通过反射去进行调用,如下代码所示,

Class <?>  clazz  =  Class.forName( " com.sun.awt.AWTUtilities " );
Method method 
=  clazz.getMethod( " setWindowShape " , Window. class , Shape. class );


1. 创建正常窗体
先创建一个简单的界面,它使用BorderLayout,在其中安放5个JButton,如下代码所示,

public   class  ShapedFrame  extends  JFrame {

    
private   static   final   long  serialVersionUID  =   - 2291343874280454383L ;

    
private  JButton centerButton  =   new  JButton( " Center " );

    
public  ShapedFrame() {
        
super ( " Shaped Frame " );
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initUI();
    }

    
private   void  initUI() {
        Container container 
=  getContentPane();
        container.setLayout(
new  BorderLayout());

        container.add(
new  JButton( " TOP " ), BorderLayout.PAGE_START);
        container.add(
new  JButton( " RIGHT " ), BorderLayout.LINE_END);
        container.add(
new  JButton( " BOTTOM " ), BorderLayout.PAGE_END);
        container.add(
new  JButton( " LEFT " ), BorderLayout.LINE_START);
        container.add(centerButton, BorderLayout.CENTER);
    }

    
public   static   void  main(String[] args) {
        SwingUtilities.invokeLater(
new  Runnable() {

            @Override
            
public   void  run() {
                ShapedFrame frame 
=   new  ShapedFrame();
                frame.setSize(
new  Dimension( 400 300 ));
                frame.setUndecorated(
true );
                setAtCenter(frame);
                frame.setVisible(
true );
            }
        });
    }

    
//  将Window置于屏幕正中
     private   static   void  setAtCenter(Window window) {
        Dimension screenSize 
=  Toolkit.getDefaultToolkit().getScreenSize();
        window.setLocation((screenSize.width 
-  window.getWidth())  /   2 ,
                (screenSize.height 
-  window.getHeight())  /   2 );
    }
}


执行上述程序的效果如下图所示,


2. 创建不规则窗体
基于上述程序创建不规则窗体,使整个窗体正好缺失掉RIGHT JButton所在的区域,如下代码所示,

public   class  ShapedFrame  extends  JFrame {

    
private   static   final   long  serialVersionUID  =   - 2291343874280454383L ;

    
private   static  Method method  =   null ;

    
static  {
        
try  {
            Class
<?>  clazz  =  Class.forName( " com.sun.awt.AWTUtilities " );
            method 
=  clazz.getMethod( " setWindowShape " , Window. class , Shape. class );
        } 
catch  (Exception e) {
            e.printStackTrace();
        }
    }

    
private  JButton centerButton  =   new  JButton( " Center " );

    
public  ShapedFrame() {
        
super ( " Shaped Frame " );
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initUI();
        addComponentListener(componentListener);
    }

    
private   void  initUI() {
        Container container 
=  getContentPane();
        container.setLayout(
new  BorderLayout());

        container.add(
new  JButton( " TOP " ), BorderLayout.PAGE_START);
        container.add(
new  JButton( " RIGHT " ), BorderLayout.LINE_END);
        container.add(
new  JButton( " BOTTOM " ), BorderLayout.PAGE_END);
        container.add(
new  JButton( " LEFT " ), BorderLayout.LINE_START);
        container.add(centerButton, BorderLayout.CENTER);
    }

    
private  ComponentListener componentListener  =   new  ComponentAdapter() {

        @Override
        
public   void  componentResized(ComponentEvent evt) { // 当UI组件(JFrame)的尺寸发生改变时,调用该方法
            Rectangle frameRect 
=  getBounds();
            Rectangle spaceRect 
=  centerButton.getBounds();

            Point o1 
=   new  Point( 0 0 );
            Point o2 
=   new  Point(frameRect.width,  0 );
            Point o3 
=   new  Point(frameRect.width, frameRect.height);
            Point o4 
=   new  Point( 0 , frameRect.height);

            Point i1 
=   new  Point(spaceRect.x  +  spaceRect.width, spaceRect.y);
            Point i2 
=   new  Point(frameRect.width, spaceRect.y);
            Point i3 
=   new  Point(frameRect.width, spaceRect.y
                    
+  spaceRect.height);
            Point i4 
=   new  Point(spaceRect.x  +  spaceRect.width, spaceRect.y +  spaceRect.height);

            
int [] xpoints  =   new   int [] { o1.x, o2.x, i2.x, i1.x, i4.x, i3.x, o3.x, o4.x };
            
int [] ypoints  =   new   int [] { o1.y, o2.y, i2.y, i1.y, i4.y, i3.y, o3.y, o4.y };
            
int  npoints  =   8
            // 构建一个六边形,将RIGHT JButton所处的位置空缺出来

            Shape shape 
=   new  Polygon(xpoints, ypoints, npoints);

            setWindowShape(ShapedFrame.
this , shape);
        }
    };

    
//  设置Window的形状
     private   static   void  setWindowShape(Window window, Shape shape) {
        
try  {
            method.invoke(
null , window, shape);
        } 
catch  (Exception e) {
            e.printStackTrace();
        }
    }

    
public   static   void  main(String[] args) {
        SwingUtilities.invokeLater(
new  Runnable() {

            @Override
            
public   void  run() {
                ShapedFrame frame 
=   new  ShapedFrame();
                frame.setSize(
new  Dimension( 400 300 ));
                frame.setUndecorated(
true );
                setAtCenter(frame);
                frame.setVisible(
true );
            }
        });
    }

    
//  将Window置于屏幕正中
     private   static   void  setAtCenter(Window window) {
        Dimension screenSize 
=  Toolkit.getDefaultToolkit().getScreenSize();
        window.setLocation((screenSize.width 
-  window.getWidth())  /   2 ,
                (screenSize.height 
-  window.getHeight())  /   2 );
    }
}


执行上述程序后,会有如下图所示的效果,

2
3
分享到:
评论

相关推荐

    不规则窗体不规则窗体不规则窗体

    在IT行业中,"不规则窗体"通常是指在软件或...通过理解GUI设计原则,掌握图形渲染技术,编写自定义控件,以及注重性能和无障碍性,开发者可以构建出独特且功能强大的不规则窗体应用,为用户提供新颖且高效的交互体验。

    C#创建不规则窗体

    在C#编程中,WinForms是一个用于构建桌面应用程序的强大框架。它允许开发者创建具有丰富用户界面的...在提供的压缩包文件中,包含了创建不规则窗体的工程文件,可以直接运行查看示例效果,也可以作为学习和开发的起点。

    不规则窗体WPF

    在Windows Presentation Foundation (WPF) 中,不规则窗体(又称形状窗体或自定义形状窗体)是指那些不遵循标准矩形外观的窗口。这种技术允许开发者创建具有独特视觉效果的应用程序,如心形、星形或其他任意形状的...

    c++ builder 不规则窗体显示代码

    在不规则窗体中,TShape控件是构建自定义形状的基础。通过调整TShape的界限和填充属性,可以创建出复杂的形状。 2. **WM_NCPAINT消息**:Windows消息机制中的WM_NCPAINT消息是在非客户区进行绘制的信号。在C++ ...

    QT不规则窗体

    QT不规则窗体是Qt库中的一个特性,它允许开发者创建具有非标准形状的窗口,这些窗口不再局限于传统的矩形,而是可以自定义为任意形状。这种技术在UI设计中非常有用,可以用来创建引人注目的应用界面,提高用户体验。...

    MFC 绘制不规则窗体 示例代码

    本示例代码着重展示了如何利用MFC来实现一个不规则形状的窗体,即“不规则窗体”。不规则窗体通常指的是那些形状不再局限于标准矩形的窗口,可以依据特定的图像或其他规则进行绘制,呈现出更为独特的视觉效果。这种...

    WPF一个不规则窗体实例

    在Windows Presentation Foundation(WPF)中,创建一个不规则窗体意味着我们想要设计一个窗口,其边界和形状不受传统矩形限制。WPF提供了一种高级的图形渲染机制,允许开发者构建具有复杂形状和自定义边界的用户...

    WinForm例子 不规则窗体 C#

    "不规则窗体"是指那些不遵循标准矩形形状的窗口,它可以是任意形状,如圆形、星形或其他自定义图形。这样的设计可以为应用程序提供独特的视觉效果和用户体验。 创建不规则窗体的核心在于覆盖WinForm的默认绘图机制...

    winform 教你如何创建不规则窗体

    在某些情况下,我们需要创建不规则窗体,即那些形状非标准矩形的窗口,来满足特殊的设计需求或者提供更独特的用户体验。本文将详细讲解如何在WinForm中实现不规则窗体的创建。 首先,不规则窗体的实现主要依赖于...

    实现不规则窗体

    在IT领域,"不规则窗体"是指那些形状并非标准矩形的窗口,它们可以有任意形状,比如根据自定义的图像或者特定图形边界来定义窗口的形状。这种技术常用于提升应用程序的视觉效果和用户体验。在本话题中,我们将专注于...

    创建不规则窗体的软件源码

    在IT行业中,创建不规则窗体是一项常见的任务,特别是在开发具有独特用户界面的软件时。不规则窗体,顾名思义,是指那些形状并非标准矩形的窗口,它们可以是任意多边形或其他形状,为用户提供更加个性化的视觉体验。...

    C# winfrom 不规则窗体实例

    在C#编程环境中,Winform(Windows Forms)...总的来说,创建C# Winform不规则窗体涉及了图形绘制、事件处理、透明度控制等多个方面,开发者需要对GDI+有良好的理解和实践,才能构建出独特且美观的非矩形窗体应用程序。

    不规则窗体的制作.doc

    在不规则窗体的制作过程中,`GraphicsPath`负责根据程序员的指令绘制复杂的形状,而`Region`则依赖于`GraphicsPath`实例来构建非矩形的窗体边界。 实现不规则窗体的基本步骤如下: 1. **创建GraphicsPath实例**:...

    详解使用C#制作不规则窗体的方法

    在C#编程环境中,制作不规则窗体是指创建形状不局限于矩形的窗口,这种窗体可以具有自定义的形状,比如圆形、心形或者其他任意图形。传统的Windows应用程序通常使用矩形窗口,但通过特定的技术,我们可以打破这个...

    winform创建不规则窗体和控件源码.rar

    这个"winform创建不规则窗体和控件源码.rar"文件显然包含了一个示例项目,展示了如何在WinForm应用程序中创建具有不规则形状的窗体和控件。在C#中,实现这一功能需要利用GDI+(Graphics Device Interface Plus)的...

    C#制作不规则窗体例子

    本示例探讨的是如何利用C#制作不规则窗体,即非标准形状的窗口,这种技术通常用于创建具有独特视觉效果的应用程序。在描述中提到的"vs2010启动界面"就是一个典型的不规则窗体应用,它采用了非矩形形状,增加了界面的...

    wpf siverlight 不规则窗体布局

    在Windows Presentation Foundation (WPF) 和Silverlight这两个微软的UI开发框架中,创建不规则窗体布局是一项挑战,但同时也提供了丰富的自定义可能性。本文将深入探讨如何在这些平台上实现不规则窗体布局,以及...

    不规则窗体(7KB)...

    标题中的“不规则窗体”指的是在编程中创建的具有非标准形状的窗口,这种窗口不遵循常规的矩形形状,而是可以定制为各种自定义的几何形状。在VB(Visual Basic)中,通过编程技术可以实现这样的效果,提供更个性化的...

    Android 不规则窗体

    在Android开发中,不规则窗体(Irregular Windows)指的是那些形状非标准矩形的窗口,通常用于实现一些独特或富有创意的用户界面效果。在Android系统中,默认情况下,所有的Activity都以矩形形式呈现,但通过自定义...

Global site tag (gtag.js) - Google Analytics