SWT Text有一个名为setMessage
的方法,可以与SWT.SEARCH
一起使用,在文本框中放置初始淡出信息。
使用SWT Combo可以做类似的事吗?它似乎没有setMessage()
方法,所以需要在这里应用其他一些技巧。
答案 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));
}
}
});