0

这与此处提出的问题有关: JTabbedPane:选项卡本身之前和之后的组件

我想附加一个鼠标侦听器,允许拖动构建的类似谷歌浏览器的框架。一开始,初始的拖拽代码相当简单,这个 Kirill-post上的鼠标拖拽代码几乎可以直接使用。如果用户单击并拖动框架的“标题栏”,我只想要这种行为,即选项卡(标签)所在的区域。这也很容易 - 只需将拖动代码更改为仅接受 JTabbedPane 上部区域中的单击,该部分包含选项卡。

但是,我想进一步减少可抓取区域,并且只允许在不被选项卡占用的区域中单击并拖动框架(棒子 - 任何人都有这个 GUI 元素的更好名称?) - 再次非常喜欢谷歌浏览器(Chrome 还在窗口模式下的标签上方添加了一个栏,以便在许多标签处于活动状态时更容易抓住框架。但 Chrome 完美地做到了这一点:可以在没有的标签部分中抓取窗口有标签,甚至在标签之间的小 v 中!)

我实际上想要做的是能够将鼠标侦听器附加到选项卡的 GUI 的背景上——但是如何完成这样的事情呢?

4

1 回答 1

1

看了这个问题的解决方案(Swing 中的draggable tabs),发现实际的TabbedPaneUI 有一些方法可以解决这两个问题: Only drag window in tab area, 原来是最难的部分,and not drag when在标签本身之上。相关代码如下,在标有“// ::”的两个部分中。该代码改编自问题提到的基里尔代码。除了选项卡位于顶部时,代码不处理其他情况 - 这在考虑我想要做什么时是有道理的。

        // mouse listener for dragging the host window
        MouseAdapter adapter = new MouseAdapter() {
            int lastX;
            int lastY;

            boolean _dragInitiated;

            @Override
            public void mousePressed(MouseEvent e) {
                TabbedPaneUI ui = _windowTabs.getUI();

                // :: Won't drag if we're positioned above a tab in tab area
                if (ui.tabForCoordinate(_windowTabs, e.getX(), e.getY()) != -1) {
                    _dragInitiated = false;
                    return;
                }

                // :: Won't drag if we're below the tab area
                int maxY = 0;
                for (int i = 0; i < _windowTabs.getTabCount(); i++) {
                    Rectangle bounds = ui.getTabBounds(_windowTabs, i);
                    int y = bounds.y + bounds.height;
                    if (y > maxY) {
                        maxY = y;
                    }
                }
                _dragInitiated = true;
                if (maxY > 0) {
                    if (e.getY() > maxY) {
                        _dragInitiated = false;
                    }
                }

                Point eventLocationOnScreen = e.getLocationOnScreen();
                if (eventLocationOnScreen == null) {
                    Component source = (Component) e.getSource();
                    eventLocationOnScreen = new Point(e.getX() + source.getLocationOnScreen().x, e.getY()
                            + source.getLocationOnScreen().y);
                }

                lastX = eventLocationOnScreen.x;
                lastY = eventLocationOnScreen.y;
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                if (!_dragInitiated) {
                    return;
                }

                Point eventLocationOnScreen = e.getLocationOnScreen();
                if (eventLocationOnScreen == null) {
                    Component source = (Component) e.getSource();
                    eventLocationOnScreen = new Point(e.getX() + source.getLocationOnScreen().x, e.getY()
                            + source.getLocationOnScreen().y);
                }

                int dx = eventLocationOnScreen.x - lastX;
                int dy = eventLocationOnScreen.y - lastY;
                Window win = POTabbedFrame.this;
                Point loc = win.getLocation();
                win.setLocation(loc.x + dx, loc.y + dy);
                lastX = eventLocationOnScreen.x;
                lastY = eventLocationOnScreen.y;
            }
        };
        _windowTabs.addMouseListener(adapter);
        _windowTabs.addMouseMotionListener(adapter);
于 2009-06-08T00:34:57.987 回答