Java 有没有办法缩放SWT组合及其';儿童

Java 有没有办法缩放SWT组合及其';儿童,java,swt,Java,Swt,我想开发一个复合控件,理想情况下,它可以将自身扩展到“分配的大小” 我想显示一个数值和3个LED类型的图像。随着合成的大小增加,值的字体大小和图像的大小成比例增加 我似乎记得.NET的WPF中有类似的东西。在SWT中有这样做的方法吗 (我知道我可以添加一个设置页面并在那里设置字体大小。只是想找到一种自动完成的方法)好的,没有内置的方法来添加缩放功能。然而,你可以自己处理,不用做太多的工作 因此,您可以使用画布,自己绘制图像和文本,并对宽度和高度应用比例。此比例根据鼠标滚轮的移动而变化 以下是一个

我想开发一个复合控件,理想情况下,它可以将自身扩展到“分配的大小”

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

我似乎记得.NET的WPF中有类似的东西。在SWT中有这样做的方法吗


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

好的,没有内置的方法来添加缩放功能。然而,你可以自己处理,不用做太多的工作

因此,您可以使用
画布
,自己绘制
图像和文本,并对宽度和高度应用比例。此比例根据鼠标滚轮的移动而变化

以下是一个例子:

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();
}
看起来像这样:


AFAIK没有内置的方法来添加缩放功能。然而,你可以自己处理,不用做太多的工作

因此,您可以使用
画布
,自己绘制
图像和文本,并对宽度和高度应用比例。此比例根据鼠标滚轮的移动而变化

以下是一个例子:

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();
}
看起来像这样:


+1-看起来这对于一个简单的例子来说很有效。我需要处理嵌套控件和布局(边距和填充)。我猜这是可以做到的…+1-看起来这对于一个简单的例子来说很有效。我需要处理嵌套控件和布局(边距和填充)。我想这是我能做到的。。。