看下面的代碼
Label?label?=?new?Label(shell,? SWT.NONE);
Image?image?=?new?Image(display,? "image.gif");
???????
label.setText("text");
label.setImage(image);
label.setText("text");
這個(gè)時(shí)候label應(yīng)該顯示什么? 我所期待的是文本text. 然而很遺憾的是label還是
顯示image. 為什么會(huì)這樣? 看了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行, 當(dāng)新的string的值和原來(lái)的一樣時(shí), 方法setText()直接返回了. 按源碼里注釋的解釋,是為了減少Windows下的重畫(huà)事件以提高性能.
我打算寫(xiě)這個(gè)到Eclipse的bug報(bào)告里, 我想這應(yīng)該算一個(gè)bug, 歡迎大家討論.
當(dāng)然這種情況不是很常見(jiàn), 但也不是沒(méi)有, 我就碰到了,? 知道了原因后, 解決的方法就很簡(jiǎn)單了.
label.setText("text");
label.setImage(image);
label.setText(label.getText()?+?"a");
label.setText("text");
在setText()之前,先用不同的值調(diào)用一次setText().
另一個(gè)可能更好的方法是, Label類提供一個(gè)方法改變顯示的模式,比如setShowText(). 但是我沒(méi)有找到類似的方法.