1

我今天的问题涉及 JFace 中的一个简单争用TreeViewer Composite。我正在尝试将 a 附加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
            }
    });
4

2 回答 2

1

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

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

if (updating) {
    return;
}
try {
   updating=true;

   // do stuff

} finally {
   updating=false;
}
于 2013-10-02T11:43:43.817 回答
0

我认为您应该将以下代码放入org.eclipse.swt.widgets.Display.asyncExec(Runnable)

column.setWidth(minSize);
于 2013-04-16T17:12:43.827 回答