看下面的代码
Label label = new Label(shell, SWT.NONE);
Image image = new Image(display, "image.gif");
label.setText("text");
label.setImage(image);
label.setText("text");
这个时候label应该显示什么? 我所期待的是文本text. 然而很遗憾的是label还是
显示image. 为什么会这样? 看了SWT的源码我才明白. 下面是Label类里setText方法的一部分,
1 public void setText (String string) {
2 checkWidget ();
3 if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
4 if ((style & SWT.SEPARATOR) != 0) return;
5 /*
6 * Feature in Windows. For some reason, SetWindowText() for
7 * static controls redraws the control, even when the text has
8 * has not changed. The fix is to check for this case and do
9 * nothing.
10 */
11 if (string.equals (text)) return;
12 text = string;
注意第11行, 当新的string的值和原来的一样时, 方法setText()直接返回了. 按源码里注释的解释,是为了减少Windows下的重画事件以提高性能.
我打算写这个到Eclipse的bug报告里, 我想这应该算一个bug, 欢迎大家讨论.
当然这种情况不是很常见, 但也不是没有, 我就碰到了, 知道了原因后, 解决的方法就很简单了.
label.setText("text");
label.setImage(image);
label.setText(label.getText() + "a");
label.setText("text");
在setText()之前,先用不同的值调用一次setText().
另一个可能更好的方法是, Label类提供一个方法改变显示的模式,比如setShowText(). 但是我没有找到类似的方法.