簡體   English   中英

防止偵聽器觸發自身

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM