Canvas 具有半透明背景
Canvas with a semi-transparent background
我想创建一个具有半透明背景的 canvas。所以我尝试了这样的事情:
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Main {
public static int WIDTH=500;
public static int HEIGHT=70;
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell(display);
shell.setSize(WIDTH,HEIGHT);
shell.setLayout(new GridLayout());
shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
create(shell);
shell.pack();
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
private static void create(Shell shell){
Canvas c= new Canvas(shell, SWT.DOUBLE_BUFFERED);
GridData gd= new GridData();
gd.heightHint=HEIGHT-30;
gd.widthHint=WIDTH-30;
c.setLayoutData(gd);
c.setBackgroundMode(SWT.INHERIT_FORCE);
c.setBackground(new Color(shell.getDisplay(), 255, 255, 255, 100));
}
}
但是 SWT 似乎没有考虑我用于 Canvas 背景的颜色 (100) 的 alpha 部分,除非我输入 0,如果我使用 0,canvas 是完全透明的,在所有其他情况下都是不透明的。
我是不是哪里弄错了,还是 SWT 的问题?
我在 Windows 8.
上使用 SWT
正如 greg-449 所指出的,这是 windows 环境下 SWT 中的一个错误。我在 SWT 中打开了一个缺陷:https://bugs.eclipse.org/bugs/show_bug.cgi?id=528249
作为解决方法,我们始终可以在 GC 上设置 aplha 自行绘制 canvas,这种方法适用于所有环境:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Main {
public static int WIDTH=500;
public static int HEIGHT=70;
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell(display);
shell.setSize(WIDTH,HEIGHT);
shell.setLayout(new GridLayout());
shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
create(shell);
shell.pack();
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
private static void create(Shell shell){
Canvas c= new Canvas(shell, SWT.DOUBLE_BUFFERED);
GridData gd= new GridData();
gd.heightHint=HEIGHT-30;
gd.widthHint=WIDTH-30;
c.setLayoutData(gd);
c.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_TRANSPARENT));
c.setBackgroundMode(SWT.INHERIT_FORCE);
c.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
Rectangle clientArea = c.getClientArea();
e.gc.setAlpha(100);
e.gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
e.gc.fillRectangle(clientArea.x,clientArea.y,clientArea.width-1,clientArea.height-1);
}
});
}
}
我想创建一个具有半透明背景的 canvas。所以我尝试了这样的事情:
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Main {
public static int WIDTH=500;
public static int HEIGHT=70;
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell(display);
shell.setSize(WIDTH,HEIGHT);
shell.setLayout(new GridLayout());
shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
create(shell);
shell.pack();
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
private static void create(Shell shell){
Canvas c= new Canvas(shell, SWT.DOUBLE_BUFFERED);
GridData gd= new GridData();
gd.heightHint=HEIGHT-30;
gd.widthHint=WIDTH-30;
c.setLayoutData(gd);
c.setBackgroundMode(SWT.INHERIT_FORCE);
c.setBackground(new Color(shell.getDisplay(), 255, 255, 255, 100));
}
}
但是 SWT 似乎没有考虑我用于 Canvas 背景的颜色 (100) 的 alpha 部分,除非我输入 0,如果我使用 0,canvas 是完全透明的,在所有其他情况下都是不透明的。 我是不是哪里弄错了,还是 SWT 的问题?
我在 Windows 8.
上使用 SWT正如 greg-449 所指出的,这是 windows 环境下 SWT 中的一个错误。我在 SWT 中打开了一个缺陷:https://bugs.eclipse.org/bugs/show_bug.cgi?id=528249
作为解决方法,我们始终可以在 GC 上设置 aplha 自行绘制 canvas,这种方法适用于所有环境:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Main {
public static int WIDTH=500;
public static int HEIGHT=70;
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell(display);
shell.setSize(WIDTH,HEIGHT);
shell.setLayout(new GridLayout());
shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
create(shell);
shell.pack();
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
private static void create(Shell shell){
Canvas c= new Canvas(shell, SWT.DOUBLE_BUFFERED);
GridData gd= new GridData();
gd.heightHint=HEIGHT-30;
gd.widthHint=WIDTH-30;
c.setLayoutData(gd);
c.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_TRANSPARENT));
c.setBackgroundMode(SWT.INHERIT_FORCE);
c.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
Rectangle clientArea = c.getClientArea();
e.gc.setAlpha(100);
e.gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
e.gc.fillRectangle(clientArea.x,clientArea.y,clientArea.width-1,clientArea.height-1);
}
});
}
}