2012-05-27 11 views
9

Esiste la possibilità di spostare la finestra facendo clic su uno dei pannelli nella finestra quando quella finestra non è decorata?Spostare la finestra non decorata facendo clic su JPanel

Ho un pannello principale con bordo opaco di 40 pixel, e pochi pannelli con controlli interni, e vorrei spostare la finestra quando si fa clic su quel bordo. È possibile?

+1

Non v'è alcuna necessità di includere Java nel titolo, se si tratta di un tag. –

risposta

1

Sì, è molto possibile. È necessario un MouseListener per ascoltare gli eventi del mouse. inizi a muoverti e smetti di muoverti con il mouse. Quindi si traduce semplicemente la posizione della finestra della stessa quantità che il mouse traduce durante quella fase (calcolare il delta tra la vecchia posizione del mouse e la nuova posizione del mouse e aggiungerla alla posizione dei frame). Dovresti essere in grado di farlo con un ascoltatore del mouse abbastanza facilmente.

4

Ho un pannello principale con opaco bordo dimensioni di 40 pixel, e alcuni pannelli con i comandi dentro, e vorrei spostare la finestra quando si fa clic su quel confine

penso che ComponetMover da @ camickr è la classe giusta per te

29

Puoi posizionare un altro pannello sul pannello con il bordo, lasciando il bordo visibile. Utilizza il seguente codice per spostare la finestra.

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); 
     } 
    }); 
    } 
} 

Ho lavorato con questo codice per un po 'di tempo per fare una barra del titolo personalizzato per le finestre non decorati. P.S: è possibile generalizzare questo esempio estendendo JComponent anziché JPanel.

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

thisX + -thisX = 0

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

Quello che sto 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) { 

} 

}

e nel telaio costruttore

MouseLiestenerX IMove = new MouseLiestenerX(this);  
addMouseListener(IMove); 
addMouseMotionListener(IMove); 
Problemi correlati