0

これは、ここで提起された質問と関連しています 。JTabbedPane:タブ自体の前後のコンポーネント

構築されたグーグルクロームのようなフレームをドラッグできるマウスリスナーを取り付けたいと思います。最初は、最初のドラッグコードはかなり簡単で、このキリルポストのマウスドラッグコードはほとんど直接使用できます。この動作が必要なのは、ユーザーがフレームの「タイトルバー」、つまりタブ(スティックアッパー)が存在する領域をクリックしてドラッグした場合のみです。これも簡単です。ドラッグコードを変更して、タブを含む部分であるJTabbedPaneの上部領域でのクリックのみを受け入れるようにします。

ただし、取得可能な領域をさらに減らし、タブで占められていない領域でのみクリックアンドドラッグフレームを許可したいと思います(スティックアッパー-このGUI要素のより良い名前は誰ですか?)-これも非常に似ていますGoogle Chrome(Chromeは、ウィンドウモードのときにタブの上にバーを追加して、多くのタブがアクティブになっている場合にフレームを簡単に保持できるようにします。ただし、Chromeはこれを完璧に実行します。タブがあり、タブの間の小さなvでも!)

私が効果的にやりたいのは、タブのGUIの背景にマウスリスナーを接続できるようにすることですが、このようなことを実現するにはどうすればよいでしょうか。

4

1 に答える 1

1

この質問の解決策(Swingのドラッグ可能なタブ)を調べた後、実際のTabbedPaneUIには、両方の問題を修正できるいくつかのメソッドがあることがわかりました。タブ領域でウィンドウをドラッグするだけで、最も難しい部分であることが判明しました。タブ自体の上。関連するコードは、「//::」でマークされた2つのセクションに続きます。このコードは、質問に記載されているキリルコードを基にしています。このコードは、タブが一番上にある場合以外の場合を処理しません。これは、私が何をしたいのかを考えるときに意味があります。

        // 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 に答える