有没有办法缩放SWT Composite及其'孩子?

时间:2014-08-01 06:31:07

标签: java swt

我想开发一种复合控制装置,理想情况下可以将其自身扩展到它的位置。分配大小。

我想显示数值和3个LED型图像。随着合成的大小增加,值的字体大小和图像的大小成比例增加。

我似乎记得在.NET的WPF中有这样的东西。有没有办法在SWT中做到这一点?

(我知道我可以添加一个设置页面并在那里设置字体大小。只是想方设法自动完成)

1 个答案:

答案 0 :(得分:4)

AFAIK没有内置方式来添加缩放功能。但是,你可以自己完成这项工作而不需要太多的工作。

所以你可以做的是,使用Canvas,自己绘制Image和文本并在宽度和高度上应用比例。此刻度根据鼠标滚轮移动而变化。

以下是一个例子:

private static float scale = 1;
private static Font  font;

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new FillLayout());

    final Image image = new Image(display, "button.png");

    final Canvas canvas = new Canvas(shell, SWT.NONE);
    canvas.addListener(SWT.Paint, new Listener()
    {
        private int initialFontSize = -1;

        @Override
        public void handleEvent(Event event)
        {
            Font tempFont = event.gc.getFont();
            FontData data = tempFont.getFontData()[0];

            if (initialFontSize == -1)
                initialFontSize = tempFont.getFontData()[0].getHeight();
            else
            {
                if(font != null && !font.isDisposed())
                    font.dispose();

                data.setHeight((int)(initialFontSize * scale));

                font = new Font(display, data);

                event.gc.setFont(font);
            }

            Rectangle bounds = image.getBounds();
            event.gc.drawImage(image, 0, 0, bounds.width, bounds.height, 0, 0, (int) (bounds.width * scale), (int) (bounds.height * scale));
            event.gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
            event.gc.drawText("Some text here", (int)(10 * scale), (int)(10 * scale), true);
        }
    });
    canvas.addListener(SWT.MouseWheel, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            if (event.count > 0)
                scale += .2f;
            else
                scale -= .2f;

            scale = Math.max(scale, 0);

            canvas.redraw();
        }
    });
    canvas.addListener(SWT.Dispose, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            if (!image.isDisposed())
                image.dispose();
            if (!font.isDisposed())
                font.dispose();
        }
    });

    shell.pack();
    shell.setSize(400, 200);
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
        {
            display.sleep();
        }
    }
    display.dispose();
}

看起来像这样:

enter image description here

enter image description here