2012-02-15 21:18:42.0|分类: swing|浏览量: 1820
Java从JDK 6 update 10开始将内建支持构建指定形状的窗体,类com.sun.awt.AWTUtilities中的方法setWindowShape会根据不同的Shape实现去构造相应形状的窗体。AWTUtilities类是放在SUN的包中,在使用该方法时应该通过反射去进行调用,如下代码所示, 先创建一个简单的界面,它使用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边框 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); } }效果图: |