SWT外壳带圆角

时间:2014-03-15 23:55:57

标签: java swt

我一直在努力创建一个圆角的SWT Shell但没有成功。

谷歌在这个领域没什么帮助,我一直试图在shell上设置一个Region,但我找不到一种方法来创建一个圆形矩形区域。如果有人能指出我正确的方向会很棒。

由于

2 个答案:

答案 0 :(得分:5)

我认为唯一的方法是手动构建圆形 Region ,然后将其设置为shell(或任何SWT控件)。

最终不是那么难...... 4个圆圈和2个矩形:

swt rounded region

这里是我写的实用程序:

/**
 * Creates a region that delineates a rounded rectangle:
 * 
 * @param x     the initial X corner (of the original rectangle)
 * @param y     the initial Y corner (of the original rectangle)
 * @param W     the max width of the rectangle
 * @param H     the max height of the rectangle
 * @param r     the radius of the rounding circles
 * @return the following region:
 * <pre>
 *       P0 (x,y)
 *       . ___ _ _ _ _ _ _ _ _ _ _ _ ___
 *        /   \                     /   \    A
 *       |  ·  |                   |  ·  |   :
 *        \___/                     \___/    :
 *       |   <->                         |   :
 *            r                              :       
 *       |                               |   :
 *                                           :       
 *       |                               |   : H
 *                                           :
 *       |                               |   : 
 *                                           :       
 *       |                               |   :
 *                                           :
 *       | ___                       ___ |   :
 *        /   \                     /   \    :
 *       |  ·  |                   |  ·  |   :
 *        \___/ _ _ _ _ _ _ _ _ _ _ \___/    v
 *        
 *       <------------------------------->
 *                       W
 * </pre>
 */
public static Region createRoundedRectangle(int x, int y, int W, int H, int r) {
    Region region = new Region();
    int d = (2 * r); // diameter

    region.add(circle(r, (x + r), (y + r)));
    region.add(circle(r, (x + W - r), (y + r)));
    region.add(circle(r, (x + W - r), (y + H - r)));
    region.add(circle(r, (x + r), (y + H - r)));

    region.add((x + r), y, (W - d), H);
    region.add(x, (y + r), W, (H - d));

    return region;
}

circle(int, int, int)的位置(我是从某些this SWT代码段中获取的):

/**
 * Defines the coordinates of a circle.
 * @param r         radius
 * @param offsetX   x offset of the centre
 * @param offsetY   y offset of the centre
 * @return the set of coordinates that approximates the circle.
 */
public static int[] circle(int r, int offsetX, int offsetY) {
    int[] polygon = new int[8 * r + 4];
    // x^2 + y^2 = r^2
    for (int i = 0; i < 2 * r + 1; i++) {
        int x = i - r;
        int y = (int) Math.sqrt(r * r - x * x);
        polygon[2 * i] = offsetX + x;
        polygon[2 * i + 1] = offsetY + y;
        polygon[8 * r - 2 * i - 2] = offsetX + x;
        polygon[8 * r - 2 * i - 1] = offsetY - y;
    }
    return polygon;
}

答案 1 :(得分:4)