2009-06-07 5 views
0

が含まれていないタブを選択UIの部分にマウスリスナーをアタッチします JTabbedPane: Components before and after the tabs themselvesJTabbedPaneの:これは、ここに提起質問に連動しているタブに

私がすることができますマウスリスナーを添付する構築されたGoogle Chromeのようなフレームをドラッグします。まず、最初のドラッグコードは比較的簡単で、マウスドラッグコードthis Kirill-postはほとんど直接使用できます。ユーザーがクリックしてフレームの「タイトルバー」、つまりタブ(スティック・アッパー)が存在する領域をドラッグするだけで、この動作が必要になります。これは簡単です。ドラッグするコードを変更するだけで、タブを含む部分であるJTabbedPaneの上部領域のクリックを受け入れることができます。

しかし、私はグラブ可能な領域をさらに減らし、タブで占められていない領域でのみクリックアンドドラッグフレームを許可したいと思います(スティック・アッパー - 誰でもこのGUI要素の方がいいですか? - Google Chromeとよく似ています(Chromeはウィンドウモードのときにタブの上にバーを追加して、多くのタブがアクティブな場合にフレームを保持しやすくしますが、Chromeはこれを完全に行います:タブ付き部分でウィンドウをつかむことができます)タブのGUIの背景にマウスのリスナーを付けることができるようにすることです - このようなことを達成する方法は?

答えて

1

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

 // 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); 
関連する問題