如何为 SWT Combo 设置初始消息

How to set the initial message for SWT Combo

SWT Text 有一个名为 setMessage 的方法,可与 SWT.SEARCH 一起使用以在文本框中放置初始淡出消息。

SWT Combo 可以做类似的事情吗?它似乎没有 setMessage() 方法,因此似乎需要在此处应用其他一些技巧。

你说得对,Combo 没有常规的 API 来设置消息,就像文本小部件一样。

您可以尝试使用 PaintListener 在 Combo 文本为空时绘制消息文本。

combo.addPaintListener( new PaintListener() {
  @Override
  public void paintControl( PaintEvent event ) {
    if( combo.getText().isEmpty() ) {
      int x = ...; // indent some pixels
      int y = ...; // center vertically
      event.gc.drawText( "enter something", x, y );
    }
  }
} );

此外,您将需要多个侦听器,以便在其 原生 外观更新后重绘 Combo。

combo.addListener( SWT.Modify, event -> combo.redraw() );

消息当然需要修改侦听器 show/hide 但可能需要更多侦听器才能在消息无效时重绘消息。此答案可能会进一步提示需要捕获哪些事件:

但是请注意,不支持在 Canvas 以外的控件上绘图,并且可能无法在所有平台上运行。

为我的目的工作的绘画侦听器的更简单替代方案涉及使用 FocusListener 以编程方式设置文本和文本颜色。这是一个例子:

    final String placeholder = "Placeholder";
    combo.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
    combo.setText(placeholder);
    combo.addFocusListener(new FocusListener() {
        @Override
        public void focusLost(FocusEvent e) {
            String text = combo.getText();
            if(text.isEmpty()) {
                combo.setText(placeholder);
                combo.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
            }
        }

        @Override
        public void focusGained(FocusEvent e) {
            String text = combo.getText();
            if(text.equals(placeholder)) {
                combo.setText("");
                combo.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
            }
        }
    });