JTabbedPane: присоедините слушатель мыши к той части интерфейса выбора вкладок, которая не содержит вкладки - PullRequest
0 голосов
/ 07 июня 2009

Это связано с вопросом, поставленным здесь: JTabbedPane: компоненты до и после самих вкладок

Я хочу подключить слушатель мыши, который позволяет перетаскивать созданный Google Chrome-подобный кадр. Начнем с того, что первоначальный код перетаскивания довольно прост, и код перетаскивания мышью на в этом посте Кирилла можно использовать практически напрямую. Я бы хотел, чтобы такое поведение происходило только в том случае, если пользователь щелкает и перетаскивает «строку заголовка» фрейма, то есть область, в которой находятся вкладки (верхушки). Это также легко - просто измените код перетаскивания, чтобы принимать клики только в верхней области JTabbedPane, той части, которая содержит вкладки.

Тем не менее, я хочу еще больше уменьшить область захвата и разрешить только рамку щелчка и перетаскивания в области, НЕ занятой вкладками (вставки - у кого-нибудь есть лучшее имя для этого элемента GUI?) - опять же, как в Google Chrome (Chrome также добавляет панель над вкладками в оконном режиме, чтобы легче было удерживать рамку, если много вкладок активны. Но Chrome делает это идеально: в окне с вкладками можно захватить окно, которое не имеет вкладок, и даже в маленьком v между вкладками!)

Что я действительно хотел бы сделать, так это уметь прикреплять слушателей мыши к фону графического интерфейса для вкладок - но как сделать что-то подобное?

1 Ответ

1 голос
/ 08 июня 2009

Посмотрев на решения для этого вопроса (перетаскиваемые вкладки в Swing), я обнаружил, что в реальном TabbedPaneUI есть несколько методов, которые могут решить обе проблемы: Только перетаскивать окно в области вкладок, которое оказалось быть самой сложной частью, и не перетаскивать, когда над самими вкладками. Соответствующий код следует в двух разделах, помеченных "// ::". Код адаптирован из упомянутого вопроса Кирилл-код. Код не обрабатывает другие случаи, кроме случаев, когда вкладки находятся наверху - что имеет смысл при рассмотрении того, что я хочу сделать.

        // 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);
...