暂时禁用JSplitPane分隔符侦听器

时间:2015-04-13 14:01:55

标签: java listener jsplitpane

我有一个简单的JSplitPane,它在调整大小时有侦听器,并且在分隔符移动时有监听器。我需要在调整大小监听器中设置分隔符位置而不使用分隔符监听器打印出“foo”,但是这个代码boolean listener似乎无法解决问题。

addComponentListener(new ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent e) {
            listener = false;
            setDividerLocation(lastDividerLocation);
            listener = true;
        }

    });
addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent e) {
            if (listener) {
                System.out.println("foo");
            }
        }
    });

有什么想法?感谢

编辑: SSCCE

import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class Split extends JSplitPane {

    private boolean listener = true;
    private double lastDividerLocation = 0.5;

    public Split() {
        this.setOrientation(VERTICAL_SPLIT);

        this.add(new JPanel(), JSplitPane.TOP);
        this.add(new JPanel(), JSplitPane.BOTTOM);

        this.setDividerLocation(300);

        final PropertyChangeListener dividerListener = new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent e) {
                if (listener) {
                    if (getOrientation() == VERTICAL_SPLIT) {
                        lastDividerLocation = (double) getDividerLocation() / (double) getHeight();
                    } else if (getOrientation() == HORIZONTAL_SPLIT) {
                        lastDividerLocation = (double) getDividerLocation() / (double) getWidth();
                    }
                    System.out.println("divider: " + lastDividerLocation);
                }
            }
        };
        addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener);

        addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                listener = false;
                setDividerLocation(lastDividerLocation);
                listener = true;
            }

        });

        this.setOneTouchExpandable(true);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.setSize(800, 600);
        frame.add(new Split(), BorderLayout.CENTER);
        frame.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:1)

根据我的经验,这是我发现做这种事情的两种方式之一。您可以设置共享布尔值,也可以删除并添加回侦听器。

我会更多地删除听众,它更安全,而且在我看来并不是那么昂贵的操作(现在我承认如果事件在调整大小期间发送了这么多次,它可能不是理想的)。

但是,您的解决方案也会起作用,因为事件调度线程上都会发生这两个事件,您不应该遇到并发问题。但是,请确保不要在此上下文之外更改此布尔值。


你的案例中另一个有趣的问题是为什么你需要设置最后一个位置吗?你想要达到什么目的?无法用setResizeWeight()的适当值来实现吗?