2012-05-27 20 views
9

¿Existe la posibilidad de mover la ventana haciendo clic en uno de los paneles en la ventana cuando esa ventana no está decorada?Mover la ventana sin decorar haciendo clic en JPanel

Tengo un panel principal con borde mate de 40 píxeles de tamaño y pocos paneles con controles en el interior, y me gustaría mover la ventana al hacer clic en ese borde. ¿Es eso posible?

+1

No hay necesidad de incluir Java en el título si se trata de una etiqueta. –

Respuesta

1

Sí, es muy posible. Necesita un MouseListener para escuchar los eventos del mouse. empiezas a moverte en mousedown y dejas de moverte en mouseup. Luego simplemente traduce la posición de la ventana en la misma cantidad que el mouse traduce durante esa fase (calcula la delta entre la posición anterior del mouse y la posición del nuevo mouse y agrégala a la posición de los marcos). Debería poder hacer esto con un oyente de ratón con bastante facilidad.

4

que tienen un panel principal con borde mate tamaño de 40 píxeles, y unos paneles con los controles en el interior, y me gustaría para mover la ventana al hacer clic en esa frontera

creo que ComponetMover por @ Camickr es la clase correcta para usted

29

Puede colocar otro panel sobre el panel con el borde, dejando el borde visible.Utilice el siguiente código para mover su ventana.

public class MotionPanel extends JPanel{ 
    private Point initialClick; 
    private JFrame parent; 

    public MotionPanel(final JFrame parent){ 
    this.parent = parent; 

    addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      initialClick = e.getPoint(); 
      getComponentAt(initialClick); 
     } 
    }); 

    addMouseMotionListener(new MouseMotionAdapter() { 
     @Override 
     public void mouseDragged(MouseEvent e) { 

      // get location of Window 
      int thisX = parent.getLocation().x; 
      int thisY = parent.getLocation().y; 

      // Determine how much the mouse moved since the initial click 
      int xMoved = (thisX + e.getX()) - (thisX + initialClick.x); 
      int yMoved = (thisY + e.getY()) - (thisY + initialClick.y); 

      // Move window to this position 
      int X = thisX + xMoved; 
      int Y = thisY + yMoved; 
      parent.setLocation(X, Y); 
     } 
    }); 
    } 
} 

He estado trabajando con este código por un tiempo para crear una barra de título personalizada para ventanas sin decoración. P.S.:Puede generalizar este ejemplo extendiendo JComponent en lugar de JPanel.

0
int xMoved = (thisX + e.getX()) - (thisX + initialClick.x); 

thisX + -thisX = 0

int xMoved = e.getX()-initialClick.x; 

Lo que estoy usando.

public class MouseLiestenerX implements MouseListener,MouseMotionListener{ 

private theFrame; 

public MouseLiestenerX(Frame theFrame){ 
this.theFrame = theFrame; 

} 

private Point startClick; 

public void mouseDragged(MouseEvent e) { 
    int deltaX = e.getX()-startClick.x; 
    int deltaY = e.getY()-startClick.y; 

    Core.getSp().setLocation(theFrame.getLocation().x+deltaX, theFrame.getLocation().y+deltaY); 
} 

public void mousePressed(MouseEvent e) { 
    startClick = e.getPoint(); 
} 

public void mouseMoved(MouseEvent e){ 

} 
@Override 
public void mouseClicked(MouseEvent e) { 


} 
@Override 
public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void mouseReleased(MouseEvent e) { 

} 

}

y en su constructor Marco

MouseLiestenerX IMove = new MouseLiestenerX(this);  
addMouseListener(IMove); 
addMouseMotionListener(IMove); 
Cuestiones relacionadas