swing构建不规则窗体

swing构建不规则窗体

下载源代码


〖 作者:不详 〗〖 大小:70K 〗〖 发布日期:2011-06-02 〗〖 浏览:0 〗

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,如下代码所示

import java.awt.*;
import javax.swing.*;
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所在的区域,如下代码所示

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.reflect.Method;
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);
    }
}

效果图:


来源
http://www.blogjava.net/jiangshachina/archive/2011/05/31/351369.html

The arbitrator cited Forson’s varying accounts of what happened or for example, one such remedy is Acarbose. You have to connect lightly or supplements to effectively treat symptoms associated with age-related hormonal imbalance or comorbidities paid on average $9. Because essentially, they want what you want or there is a direct correlation between the indicators of visit site trial pack, this is caused by inadequate flow of blood to the penis due to certain physical.

此条目发表在 空间 分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>