A good approach is to implement the mouse events on the component by identifying which area of the JLabel is moving and then 'playing' with the cursor types; I'll share the core of the code I wrote to change sizes with the mouse.
Cursor CD = new Cursor( Cursor.DEFAULT_CURSOR );
Cursor C1 = new Cursor( Cursor.NW_RESIZE_CURSOR );
Cursor C2 = new Cursor( Cursor.SW_RESIZE_CURSOR );
Cursor C3 = new Cursor( Cursor.NE_RESIZE_CURSOR );
Cursor C4 = new Cursor( Cursor.SE_RESIZE_CURSOR );
Cursor C5 = new Cursor( Cursor.W_RESIZE_CURSOR );
Cursor C6 = new Cursor( Cursor.E_RESIZE_CURSOR );
Cursor C7 = new Cursor( Cursor.N_RESIZE_CURSOR );
Cursor C8 = new Cursor( Cursor.S_RESIZE_CURSOR );
int espacio = 4, tamMin = 30;
etiqueta.addMouseMotionListener( new MouseMotionAdapter() {
public void mouseMoved( MouseEvent evt ) {
if( evt.getX() <= espacio && evt.getY() <= espacio ) {
etiqueta.setCursor( C1 );// Sobre los bordes superior/izquierdo
} else if( evt.getX() <= espacio && evt.getY() >= etiqueta.getHeight() - espacio ) {
etiqueta.setCursor( C2 );// Sobre los bordes inferior/izquierdo
} else if( evt.getY() <= espacio && evt.getX() >= etiqueta.getWidth() - espacio ) {
etiqueta.setCursor( C3 );// Sobre los bordes superior/derecho
} else if( evt.getY() >= etiqueta.getHeight() - espacio && evt.getX() >= etiqueta.getWidth() - espacio ) {
etiqueta.setCursor( C4 );// Sobre los bordes inferior/derecho
} else if( evt.getX() <= espacio ) {
etiqueta.setCursor( C5 );// Sobre el borde izquierdo
} else if( evt.getX() >= etiqueta.getWidth() - espacio ) {
etiqueta.setCursor( C6 );// Sobre el borde derecho
} else if( evt.getY() <= espacio ) {
etiqueta.setCursor( C7 );// Sobre el borde superior
} else if( evt.getY() >= etiqueta.getHeight() - espacio ) {
etiqueta.setCursor( C8 );// Sobre el borde inferior
} else {
etiqueta.setCursor( CD );// Ninguno de los bordes
}
}
public void mouseDragged( MouseEvent evt ) {
// captura del tipo de cursor
int tipoCursor = etiqueta.getCursor().getType();
switch( tipoCursor ) {
case 4: // Tipo SouthWest [esquina inferior izquierda]
if( etiqueta.getWidth() > tamMin && etiqueta.getHeight() > tamMin ) {
etiqueta.setSize( etiqueta.getWidth() - evt.getX(), etiqueta.getHeight() - ( etiqueta.getHeight() - evt.getY() ) );
etiqueta.setLocation( etiqueta.getX() + evt.getX(), etiqueta.getY() );
}
break;
case 5: // Tipo SouthEast [esquina inferior derecha]
if( etiqueta.getWidth() > tamMin && etiqueta.getHeight() > tamMin ) {
etiqueta.setSize( etiqueta.getWidth() - ( etiqueta.getWidth() - evt.getX() ), etiqueta.getHeight() - ( etiqueta.getHeight() - evt.getY() ) );
etiqueta.setLocation( etiqueta.getX(), etiqueta.getY() );
}
break;
case 6: // Tipo NorthWest [esquina superior izquierda]
if( etiqueta.getWidth() > tamMin && etiqueta.getHeight() > tamMin ) {
etiqueta.setSize( etiqueta.getWidth() - evt.getX(), etiqueta.getHeight() - evt.getY() );
etiqueta.setLocation( etiqueta.getX() + evt.getX(), etiqueta.getY() + evt.getY() );
}
break;
case 7: // Tipo NorthEast [esquina superior derecha]
if( etiqueta.getWidth() > tamMin && etiqueta.getHeight() > tamMin ) {
etiqueta.setSize( etiqueta.getWidth() - ( etiqueta.getWidth() - evt.getX() ), etiqueta.getHeight() - evt.getY() );
etiqueta.setLocation( etiqueta.getX(), etiqueta.getY() + evt.getY() );
}
break;
case 8: // Tipo North [borde superior]
if( etiqueta.getHeight() > tamMin ) {
etiqueta.setSize( etiqueta.getWidth(), etiqueta.getHeight() - evt.getY() );
etiqueta.setLocation( etiqueta.getX(), etiqueta.getY() + evt.getY() );
}
break;
case 9: // Tipo South [borde inferior]
if( etiqueta.getHeight() > tamMin ) {
etiqueta.setSize( etiqueta.getWidth(), etiqueta.getHeight() - ( etiqueta.getHeight() - evt.getY() ) );
etiqueta.setLocation( etiqueta.getX(), etiqueta.getY() );
}
break;
case 10: // Tipo West [borde izquierdo]
if( etiqueta.getWidth() > tamMin ) {
etiqueta.setSize( etiqueta.getWidth() - evt.getX(), etiqueta.getHeight() );
etiqueta.setLocation( etiqueta.getX() + evt.getX(), etiqueta.getY() );
}
break;
case 11: // Tipo East [borde derecho]
if( etiqueta.getWidth() > tamMin ) {
etiqueta.setSize( etiqueta.getWidth() - ( etiqueta.getWidth() - evt.getX() ), etiqueta.getHeight() );
etiqueta.setLocation( etiqueta.getX(), etiqueta.getY() );
}
break;
}
actualizarDimension();
}
} );
etiqueta.addMouseListener( new MouseAdapter() {
public void mouseReleased( MouseEvent evt ) {
if( etiqueta.getWidth() <= tamMin ) {
etiqueta.setBounds( etiqueta.getX(), etiqueta.getY(), etiqueta.getWidth() - ( etiqueta.getWidth() - ( tamMin + 1 ) ), etiqueta.getHeight() );
}
if( etiqueta.getHeight() <= tamMin ) {
etiqueta.setBounds( etiqueta.getX(), etiqueta.getY(), etiqueta.getWidth(), etiqueta.getHeight() - ( etiqueta.getHeight() - ( tamMin + 1 ) ) );
}
actualizarDimension();
}
} );
componentes.add( etiqueta );
}
public void actualizarDimension() {
int W = etiqueta.getWidth() == 0 ? 1 : etiqueta.getWidth();
int H = etiqueta.getHeight() == 0 ? 1 : etiqueta.getHeight();
Image image = new ImageIcon( getClass().getResource( "/images/crash.jpeg" ) ).getImage();
image = image.getScaledInstance( W, H, Image.SCALE_SMOOTH );
etiqueta.setIcon( new ImageIcon( image ) );
info.setText( "Dimension [" + etiqueta.getWidth() + "*" + etiqueta.getHeight() + " pixeles] Posicion Ejes X:Y [" + etiqueta.getX() + ":" + etiqueta.getY() + "]" );
}
Logically you can improve the previous snippet by adding, removing and optimizing some feature that you see.