[英]Prevent a listener from triggering itself
我今天的問題涉及JFace TreeViewer
Composite
的簡單爭論。 我試圖將ControlListener
附加到我的樹的列以強制最小寬度。 為此,我每次都在調整列的大小,如果新的寬度太小,我會在其上施加最小值。
這是一個GUI問題,但實際上,在任何帶有修改監聽器的Java環境中都可能發生這種情況。 我想也許你們中的一些Java極客可能會喜歡它。
public static void getSizeControlListener(final TreeColumn column, final int minSize) {
column.addControlListener(new ControlListener() {
@Override
public void controlMoved(ControlEvent e) {}
@Override
public void controlResized(ControlEvent e) {
if(column.getWidth()<minSize) {
column.setWidth(minSize);
}
}
});
一種有效的解決方案是添加一個在入口處設置的標志,任何嵌套調用都可以引用該標志,並在必要時立即退出。 它可以工作,但是又臟又丑。
public static void getSizeControlListener(final TreeColumn column, final int minSize) {
column.addControlListener(new ControlListener() {
private boolean isRunning;
@Override
public void controlMoved(ControlEvent e) {}
@Override
public void controlResized(ControlEvent e) {
if(isRunning)
return;
isRunning = true;
if(column.getWidth()<minSize) {
column.setWidth(minSize);
}
isRunning = false
}
});
帶有標志的解決方案完全可以 ,我們定期使用此模式來防止通知級聯 。
這種級聯發生的一個例子是在MVC中同步模型視圖狀態時。 使用這樣的標志可以使我們實現具有雙向同步的無級聯的單向更新。
與您的實現唯一的不同是,我們使用try..finally
來確保始終將標志重置(也包括發生異常時):
if (updating) {
return;
}
try {
updating=true;
// do stuff
} finally {
updating=false;
}
我認為您應該將以下代碼放在org.eclipse.swt.widgets.Display.asyncExec(Runnable)
column.setWidth(minSize);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.