【问题标题】:Prevent a listener from triggering itself防止监听器触发自身
【发布时间】:2013-04-09 03:07:33
【问题描述】:

我今天的问题涉及 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
            }
    });

【问题讨论】:

    标签: java swt listener


    【解决方案1】:

    您的标志解决方案完全没问题,我们定期使用此模式来防止通知级联
    发生这种级联的一个示例是在 MVC 中同步模型视图状态时。使用这样的标志可以让我们实现双向同步的无级联单向更新。

    与您的实现的唯一区别是我们使用try..finally 来确保始终重置标志(即使发生异常时):

    if (updating) {
        return;
    }
    try {
       updating=true;
    
       // do stuff
    
    } finally {
       updating=false;
    }
    

    【讨论】:

      【解决方案2】:

      我认为你应该把下面的代码放在org.eclipse.swt.widgets.Display.asyncExec(Runnable)

      column.setWidth(minSize);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 2017-12-03
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多