Java SWT标签中的透明背景

5
在Java SWT中,我能否将一个标签放在另一个标签的上面,并使上面的标签具有透明背景?我正在一个扩展Composite类的类中进行此操作,因为我想要创建一个自定义的SWT“花式按钮”,由2个标签组成。因此,下面的标签将是仅包含图像的标签,而上面的标签将是“花式按钮”的文本标签。但是,上面的标签必须具有透明背景,以免覆盖其下面的图像。目前,上面的标签正在覆盖下面的标签。你有什么好的建议吗?谢谢!
3个回答

1

不要做

drawString("text", x, y)

drawString("text", x, y, true)

根据文档的说明,它将使背景透明。


这个答案是正确的,但不完整。请看我的下一个答案。Hartmut Schorrig - Hartmut Schorrig
这个答案是正确的,但不完整。请看我接下来的回答。Hartmut Schorrig - Hartmut Schorrig

1

相反,您可以尝试以下方法以获得相同的结果。

  • 创建一个标签
  • 使用 shell 分配图像到标签
  • 然后使用 "setText()" 在标签上写入内容。

文本将出现在图像上方。您将能够看到图像。

( 仅显示相关代码 ) 标签与文本/图像示例。

 Image image = new Image(display, "c:\\picture.jpeg"); 
 Shell shell = new Shell(SWT.NO_TRIM);
 shell.setBounds(10,10,200,200);
 shell.setBackgroundImage(image);
 shell.setBackgroundMode(SWT.INHERIT_DEFAULT);
 Label label = new Label(shell, SWT.NONE);
 label.setText("LAbel text here. ");

既然你想制作按钮,那么你可以使用相同的逻辑,同时使用“Button”API。你可以创建一个带有图像的按钮,然后在其上方设置任何文本。

(仅显示相关代码) 按钮示例

Button button = new Button(shell, SWT.PUSH);
button.setImage(image);
button.setText("Click Me");

我希望这就是你想要做的。


通过使用按钮,添加电子邮件仅在按钮的左侧充当“按钮图标”。它不会将整个本机窗口按钮替换为基于png创建的图像按钮。 - Carven
在第二个建议中,文本被图像隐藏。 - marcolopes

0

在编程中,如果想要在标签上写文本而不带背景,似乎只有使用GC类进行绘制才是最简单的方法。我已经为此编写了一个Canvas的继承类:

public class SwtTransparentLabel extends Canvas {
  
  String text = "";
  
  Font font = null;
  
  public SwtTransparentLabel(Composite parent, int style) {
    super(parent, style | SWT.TRANSPARENT);
    addPaintListener(paintListener);
  }
  
  
  public void setText (String string) {
    text = string;
  }
  
  public void setFont (Font font) {
    this.font = font; 
  }

  /**The listener for paint events. It is called whenever the window is shown newly. It does the work for graphic output. */
  protected PaintListener paintListener = new PaintListener() {
    @Override public void paintControl(PaintEvent e) {
      GC gc = e.gc;
      if(font !=null){ gc.setFont(font); }
      //no: gc.setAlpha(100); //... experience, not necessary
      gc.drawString(text, 0, 0, true);
    }
  };
}

这个工作方式类似于org.eclipse.swt.widgets.Label。

我仍在努力改进解决方案(缺少setAlignment)。 您可以访问www.vishia.org/Java上的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接