我想开发一种复合控制装置,理想情况下可以将其自身扩展到它的位置。分配大小。
我想显示数值和3个LED型图像。随着合成的大小增加,值的字体大小和图像的大小成比例增加。
我似乎记得在.NET的WPF中有这样的东西。有没有办法在SWT中做到这一点?
(我知道我可以添加一个设置页面并在那里设置字体大小。只是想方设法自动完成)
答案 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();
}
看起来像这样: