1

今日の私の問題は、 JFace での単純な競合に関係していTreeViewer Compositeます。ControlListener最小幅を強制するために、ツリーの列にa を付けようとしています。これを行うために、列のサイズが変更されるたびに監視し、新しい幅が小さすぎる場合は、最小値を課します。

これは 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);
                }
            }
    });

有効な解決策の 1 つは、ネストされた呼び出しが参照できる開始時に設定されるフラグを追加し、必要に応じてすぐに終了することです。動作しますが、汚れていて醜いです。

    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

フラグを使用したソリューションはまったく問題ありません。このパターンを定期的に使用して、通知のカスケードを防ぎます。
このようなカスケードが発生する 1 つの例は、MVC でモデル ビューの状態を同期する場合です。このようなフラグを使用すると、双方向同期でカスケードのない一方向更新を実現できます。

実装との唯一の違いはtry..finally、フラグが常にリセットされるようにするために使用することです (例外が発生した場合も同様です)。

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

   // do stuff

} finally {
   updating=false;
}
于 2013-10-02T11:43:43.817 に答える