How to allow the user to resize a label after creating it in Java?

2

I am creating a tag editor, which consists of a panel that is where the label is loaded, these can contain text or images, once created I would like the user to be able to resize them.

I already have the other functions (move it from position, etc.), this is the only function I need but I can not find a way to do it, that's how my program looks:

This is what I want to achieve with the label created:

    
asked by Giovani Preciado Ortiz 01.07.2017 в 01:52
source

2 answers

2

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.

    
answered by 03.07.2017 / 21:28
source
1

You can try, in the label constructor, to put setResizable(true); , creating a class for the label in question that extends from JLabel.

    
answered by 01.07.2017 в 11:45