构建不规则窗体(一)

2014-11-24 01:00:34 · 作者: · 浏览: 2

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,