如何使标签在SWT中继承复合材料的GC
时间:2020-03-06 14:45:15 来源:igfitidea点击:
我正在编写一个应用程序,我们的设计师希望对某些合成材料的某些背景使用渐变。
我写了以下代码:
composite.addListener (SWT.Paint, new Listener () { public void handleEvent (Event e) { GC gc = e.gc; Rectangle rect = composite.getClientArea (); Color color1 = new Color (display, 0, 0, 0); Color color2 = new Color (display, 255, 255, 255); gc.setForeground(color1); gc.setBackground(color2); gc.fillGradientRectangle (rect.x, rect.y, rect.width, rect.height , true); } });
这样可以在复合材料上精细地绘制渐变,但是在复合材料的顶部具有标签/标签,画布和链接。
在这些区域中,背景就是我们在绘制空白画布时获得的纯灰色。
我试图强迫标签继承背景,如下所示:
label.setBackgroundMode(SWT.INHERIT_DEFAULT) //SWT.INHERIT_FORCE Doesn't work either
但是,这给我留下了相同的默认灰色,并且在"复合材料"顶部的组件后面没有渐变。
对于将渐变作为每个元素的背景有什么建议吗?
我不会反对在提供了图像的gc上绘制渐变,然后将背景设置为该图像。但是,该方法,复合或者其任何元素都根本没有起作用。
同样,我无法根据自己的知识来单独设置渐变。我们希望整个复合物是一个均匀的流动梯度。
[edit]我在此处上传了一个示例,直到twitpic。
谢谢,
布赖恩·吉安福卡罗(Brian Gianforcaro)
解决方案
Listener listener = new Listener () { public void handleEvent (Event e) { GC gc = e.gc; Rectangle rect = composite.getClientArea (); Point offset = ((Control)e.widget).toControl(composite.toDisplay(0, 0)); Color color1 = new Color (display, 0, 0, 0); Color color2 = new Color (display, 255, 255, 255); gc.setForeground(color1); gc.setBackground(color2); gc.fillGradientRectangle (rect.x + offset.x, rect.y + offset.y, rect.width, rect.height , true); } } composite.addListener (SWT.Paint, listener); label.addListener(SWT.Paint, listener);
另外,完成所有创建的Color实例后,请小心处理它们。否则,我们将泄漏系统资源并最终耗尽。
使用Composite.setBackgroundMode(SWT.INHERIT_DEFAULT),但不要绘制复合图像,而是直接绘制图像,并使用Composite.setBackgroundImage(Image)将其设置为背景图像。除非我没有技巧,否则这意味着我们也只需在调整合成的大小时重新生成图像。
我们应该可以按原样剪切此代码,以了解我的意思:
import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; /** * SWT composite with transparent label * * @author McDowell */ public class Sweet { private Image imageGradient; private Label label; private Composite composite; private void createComponents(Shell parent) { composite = new Composite(parent, SWT.NONE); composite.addListener(SWT.Resize, new Listener() { public void handleEvent(Event e) { changeImage(); } }); composite.setLayout(new FormLayout()); composite.setBackgroundMode(SWT.INHERIT_DEFAULT); label = new Label(composite, SWT.None); label.setText("Hello, World!"); } private void changeImage() { Image oldImage = imageGradient; Display display = composite.getDisplay(); Rectangle rect = composite.getClientArea(); imageGradient = new Image(display, rect.width, rect.height); GC gc = new GC(imageGradient); try { Color color1 = new Color(display, 200, 200, 255); try { Color color2 = new Color(display, 255, 255, 255); try { gc.setForeground(color1); gc.setBackground(color2); gc.fillGradientRectangle(rect.x, rect.y, rect.width, rect.height, true); } finally { color2.dispose(); } } finally { color1.dispose(); } } finally { gc.dispose(); } composite.setBackgroundImage(imageGradient); if (oldImage != null) { oldImage.dispose(); } } private void openShell(Display display) { Shell shell = new Shell(display); try { shell.setSize(200, 100); shell.setLayout(new FillLayout()); createComponents(shell); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } finally { if (!shell.isDisposed()) { shell.dispose(); } } } public void run() { Display display = Display.getDefault(); try { openShell(display); } finally { display.dispose(); } } public void dispose() { if (imageGradient != null) { imageGradient.dispose(); } } public static void main(String[] args) { Sweet sweet = new Sweet(); try { sweet.run(); } finally { sweet.dispose(); } } }