Hi,
ich habe ein JRootPane erstellt.
In diesem JRootPane befindet sich beispielsweise ein Bild.
Man soll das JRootPane in seiner Größer durch ziehen mit der Maus verändern können.
Unten ist ein kleiner Codeabschnitt meines Programms zu sehen.
Ich habe mir das GlassPane des JRootPane geholt und an dieses den MouseMotionListener registriert.
Wenn ich das Pane nach rechts dragge dann funktioniert alles wunderbar.
Wenn ich das Pane nach oben versuche zu draggen, so wir das Aufziehen nur sehr stotterhaft
ausgeführt und der Mauszeiger eilte irgendwann dem Pane voraus.
Eigentlich müsste der MousMotionListener nach jeder Pixebewegung aufgerufen werden,
so dass
diffX = me.getX()-lastX;
diffY = me.getY()-lastY;
die Werte -1, 0 oder +1 annehmen. Dem ist aber auch nicht so.
ich habe ein JRootPane erstellt.
In diesem JRootPane befindet sich beispielsweise ein Bild.
Man soll das JRootPane in seiner Größer durch ziehen mit der Maus verändern können.
Unten ist ein kleiner Codeabschnitt meines Programms zu sehen.
Ich habe mir das GlassPane des JRootPane geholt und an dieses den MouseMotionListener registriert.
Wenn ich das Pane nach rechts dragge dann funktioniert alles wunderbar.
Wenn ich das Pane nach oben versuche zu draggen, so wir das Aufziehen nur sehr stotterhaft
ausgeführt und der Mauszeiger eilte irgendwann dem Pane voraus.
Eigentlich müsste der MousMotionListener nach jeder Pixebewegung aufgerufen werden,
so dass
diffX = me.getX()-lastX;
diffY = me.getY()-lastY;
die Werte -1, 0 oder +1 annehmen. Dem ist aber auch nicht so.
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
public class TestRootPaneMouseMotionListener implements MouseMotionListener
{
private TestRootPane rootPane;
private Component glassPane;
private int caseHandle;
private int thick;
private int lastX;
private int lastY;
private int diffX;
private int diffY;
private Rectangle handleN;
private Rectangle handleE;
private Cursor cursorN;
private Cursor cursorE;
private Cursor cursorMOVE;
private String actualCursor;
public TestRootPaneMouseMotionListener(TestRootPane rootPane)
{
this.rootPane = rootPane;
this.glassPane = rootPane.getGlassPane();
this.thick = 14;
this.handleN = new Rectangle(rootPane.getWidth()/2-thick/2, 0, thick, thick);
this.handleE = new Rectangle(rootPane.getWidth()-thick, rootPane.getHeight()/2-thick/2, thick, thick);
actualCursor = "";
cursorN = new Cursor(Cursor.N_RESIZE_CURSOR);
cursorE = new Cursor(Cursor.E_RESIZE_CURSOR);
cursorMOVE = new Cursor(Cursor.MOVE_CURSOR);
}
@Override
public void mouseDragged(MouseEvent me)
{
if(!rootPane.getStartedDragFlag())
{
lastX = me.getX();
lastY = me.getY();
if(handleN.contains(me.getPoint()))
{
caseHandle = 0;
}
else if(handleE.contains(me.getPoint()))
{
caseHandle = 3;
}
else caseHandle = 8;
}
else
{
diffX = me.getX()-lastX;
diffY = me.getY()-lastY;
lastX = me.getX();
lastY = me.getY();
if( ((rootPane.getWidth()+diffX) > 14) && ((rootPane.getHeight()+diffY) > 14) )
{
switch(caseHandle)
{
case 0://North
rootPane.setBounds(rootPane.getX(), rootPane.getY()+diffY, rootPane.getWidth(), rootPane.getHeight()-diffY);
break;
case 3://East
rootPane.setBounds(rootPane.getX(), rootPane.getY(), rootPane.getWidth()+diffX, rootPane.getHeight());
break;
}
handleN.setLocation(rootPane.getWidth()/2-thick/2, 0);
handleE.setLocation(rootPane.getWidth()-thick, rootPane.getHeight()/2-thick/2);
rootPane.validate();
}
}
}
@Override
public void mouseMoved(MouseEvent me)
{
if(handleN.contains(me.getPoint()))
{
if(!actualCursor.equals("cursorN"))
{
glassPane.setCursor(cursorN);
actualCursor = "cursorN";
}
}
else if(handleE.contains(me.getPoint()))
{
if(!actualCursor.equals("cursorE"))
{
glassPane.setCursor(cursorE);
actualCursor = "cursorE";
}
}
else
{
if(!actualCursor.equals("cursorMOVE"))
{
glassPane.setCursor(cursorMOVE);
actualCursor = "cursorMOVE";
}
}
}
}