# Objekte auf Fenster verschieben. Bewegliche jPanels.



## Borti (8. Sep 2006)

Moin moin,

ich habe da ein Problem beim verschieben von Objekten. Ich habe ein Fenster in dem ich eine ToolBar eine StatusBar
und ein ScrollPane habe. Die ToolBar ist vorerst egal. Die StatusBar nutze ich derzeit um mir Koordinaten anzeigen
zu lassen. Auf dem ScrollPane befindet sich ein jPanel worauf sich wiederum zwei jPanel (flaeche, flaeche2) befinden
die ich verschieben kann.

So sieht das aus





flaeche und flaeche2 besitzen jeweils ein mousePressed und ein mouseDragged Event um sie zu verschieben.
Das Verschieben der Flächen nach links und oben soll geblockt werden (rote Linie), d.h. es soll nicht möglich sein die Flächen
aus dem Fensterfocus zu schieben. Wenn jemand versucht die Fläche über die linke Grenze oder über die obere Grenze zu schieben,
dann soll es einfach an der Grenze andocken.

Wie hier zu sehen





Dazu habe ich folgende Funktion geschrieben.

```
private void getJPanelFlaeche2Koordinaten()
    {
        int intObenLinksX = jPanelFlaeche2.getX();
        int intObenLinksY = jPanelFlaeche2.getY();
        
        int intUntenRechtsX = jPanelFlaeche2.getX() + jPanelFlaeche2.getWidth();
        int intUntenRechtsY = jPanelFlaeche2.getY() + jPanelFlaeche2.getHeight();
        
        jLabel1.setText( "oben links    x: " + intObenLinksX + "      " + "y: " + intObenLinksY );
        jLabel2.setText( "unten rechts    x: " + intUntenRechtsX  + "      " + "y: " + intUntenRechtsY );
     
        /** Verhindert, dass die verschiebbaren Flaechen
         * das Fenster nach oben oder nach rechts verlassen koennen.
         */
        if( intObenLinksX < 0 )
        {
            jPanelFlaeche2.setLocation( 0 , intObenLinksY );
        }
       
        if( intObenLinksY < 0 )
        {
            jPanelFlaeche2.setLocation( intObenLinksX , 0 );
        }
    }
```

Diese Funktion rufe ich im mousePressed sowie im mouseDragged Event auf. Und genau in dieser Funktion scheint der Fehler zu liegen,
denn wenn ich an der oberen Grenze angekommen bin und dann die Fläche nach links verschiebe bewegt sie sich aus dem Fenster.

Wenn ich in der Funktion in der zweiten if abfrage die Variable intObenLinksX gegen jPanelFlaeche2.getX() austausche dann funktioniert
es ohne Probleme.

Was mache ich falsch?


----------



## Leroy42 (8. Sep 2006)

Das ist doch logisch.

Falls die Bedingung der 1. Abfrage zutrifft, setzt du bereits die neue Location. Hiervon
bekommt deine Variable _intObenLinksX_ allerdings nichts mit, da sie noch den 
Wert von vor der 1. setLocation() beinhaltet.

BTW. _intObenLinksX_, _jPanelFlaeche2_  :shock: 
Es ist doch wohl kaum nötig in jedem Variablennaemen ihren Typ mitzuschleppen.


----------



## Borti (8. Sep 2006)

Naja ganz so logisch finde ich das nicht.

hmm dann verstehe ich wohl das mouseDragged Event noch nicht richtig. Wenn ich meine Funktion getJPanelFlaeche2Koordinaten() in dem mouseDragged Event ausführe, dann müsste doch aber bei jeder Mausbewegung die Funktion erneut aufgerufen werden und so mit in der Variablen intObenLinksX der richtige Wert stehen oder irre ich mich?

BTW mein chef will das so haben  und er will auch selbst sprechende Variablennamen also nicht meine entscheidung  und da ich mit Netbeans und Matisse arbeite ist das nicht ganz so schlimm da er fast alles automatisch ändert


----------



## kaie (10. Sep 2006)

Wofür benötigst Du denn die eigene Methode? Reicht nicht sowas?

```
public Component dragComponent = null;
public int dragX = 0;
public int dragY = 0;
public void mousePressed( MouseEvent me )
{
  dragComponent = me.getSource();
  dragX = me.getX();
  dragY = me.getY();
}
public void mouseDragged( MouseEvent me )
{
  if( dragComponent!=null )
  {
     int x = dragComponent.getLocation().x+me.getX()-dragX;
     int y = dragComponent.getLocation().y+me.getY()-dragY;
     if( x<0 ) x=0;
     if( y<0 ) y=0;
     dragComponent.setLocation(x,y);
  }
}
```


----------



## Borti (13. Sep 2006)

Okay das erste habe ich geschafft nun geht es weiter.

Als nächstes soll das Programm, wenn man eine der flaechen an den rechten unteren Rand verschiebt Automatisch mit gescrollt werden. Wenn das ende der Scrollfläche erreicht ist, soll diese Automatisch um eine bestimmte pixel Fläche vergrößert werden.

Das mit dem Automatischen vergrößern der Scrollfläche funktioniert, nur das mitscrollen noch nicht so wie es soll.

Bisher mache ich das so


```
if( !jPanelCenterScrollPane.getVisibleRect().contains( jPanelFlaeche.getBounds() ) )
         {
            jScrollPane1.getViewport().scrollRectToVisible( jPanelFlaeche.getBounds() );
        }
```

Aber das ist irgendwie scheisse. Ruck ruck und es scrollt auch viel zu schnell und wenn man eine flaeche schnell aus dem Frame zieht ist es verschwunden.

Also wie bekomm ich nen Autoscroll hin?


----------



## Borti (18. Sep 2006)

Kann mir niemand helfen ?


----------

