2009-06-07 5 views
0

Dies in Verbindung mit der Frage hier gestellt ist: JTabbedPane: Components before and after the tabs themselvesJTabbedPane: Bringen Sie die Maus Zuhörer an den Teil der Registerkarte Auswahl Benutzeroberfläche, die nicht die Registerkarten enthält

Ich möchte eine Maus Hörer anschließen, die für erlaubt Ziehen Sie den konstruierten Google Chrome-ähnlichen Rahmen. Der anfängliche Code ist relativ einfach und der Code zum Ziehen der Maus bei this Kirill-post kann ziemlich direkt verwendet werden. Ich würde dieses Verhalten nur wünschen, wenn der Benutzer auf die "Titelleiste" des Rahmens klickt und zieht, dh in den Bereich, in dem sich die Tabs (der Stick-Upper) befinden. Dies ist auch einfach - ändern Sie einfach den Drag-Code so, dass nur Klicks im oberen Bereich von JTabbedPane akzeptiert werden, dem Teil, der die Tabs enthält.

Allerdings möchte ich den grabbbaren Bereich weiter reduzieren und nur Klick-und-Ziehen-Rahmen in dem Bereich erlauben, der NICHT von den Tabs belegt ist (der Stick-Upper - hat irgendjemand einen besseren Namen für dieses GUI-Element?) - wieder ganz wie Google Chrome (Chrome fügt auch im Fenstermodus eine Leiste oberhalb der Registerkarten ein, um den Rahmen leichter zu finden, wenn viele Registerkarten aktiv sind. Aber Chrome macht das perfekt: Es ist möglich, das Fenster im Registerkartenabschnitt zu greifen das hat keine Tabs, und sogar in den kleinen v zwischen den Tabs!)

Was ich effektiv tun möchte, ist in der Lage, die Maus Listener an den Hintergrund der GUI für die Tabs anhängen - Aber wie kann man so etwas erreichen?

Antwort

1

Nachdem bei den Lösungen suchen this question (ziehbar Tabs in Swing), fand ich, dass die tatsächliche TabbedPaneUI einige Methoden, die beide Probleme beheben können: Nur Drag Fenster in Tab-Bereich, das ist der schwierigste Teil entpuppte, und Ziehen Sie nicht über die Tabs selbst. Der entsprechende Code folgt in den beiden mit "// ::" gekennzeichneten Abschnitten. Der Code ist aus dem fraglichen Kirill-Code adaptiert. Der Code behandelt keine anderen Fälle, als wenn die Tabs oben sind - was sinnvoll ist, wenn man bedenkt, was ich tun möchte.

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