设置SWT Combo的初始消息

时间:2016-06-27 08:25:58

标签: swt

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

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

2 个答案:

答案 0 :(得分:4)

你是对的,Combo没有常规的API来设置像文本小部件那样的消息。

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

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() );

当然需要修改侦听器来显示/隐藏消息,但是当消息无效时,可能需要更多的侦听器来重绘消息。这个答案可能会进一步暗示需要捕获哪些事件:How to display a hint message in an SWT StyledText

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

答案 1 :(得分:1)

为我的目的而工作的绘图侦听器的一个更简单的替代方法是使用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));
            }
        }
    });