2012-09-16 4 views
2

J'ai un jFrame sans décoration seulement gui est dessiné par des graphiques GD. Je veux que les utilisateurs redimensionnent cette fenêtre mais il est impossible de le faire sans frontières. J'ai donc fait un écouteur souris à redimensionner en étant tiré d'une position spéciale. Cela fonctionne un peu mais ne s'étend pas loin jusqu'à ce qu'il s'arrête. Y a-t-il un moyen plus simple? Y a-t-il d'autres alternatives? Quelqu'un at-il déjà fait cela avec GD pur?Java comment redimensionner la fenêtre sans bordure en utilisant la souris glisser?

this.addMouseListener(new MouseAdapter() 
{ 
public void mousePressed(MouseEvent e) 
{ 
    posX=e.getX(); 
    posY=e.getY(); 

}  

}}); 

this.addMouseMotionListener(new MouseAdapter() 
{ 
public void mouseDragged(MouseEvent evt) 
{ 
if (posX >= getWidth()-25 && posY >=getHeight()-45){ 
int nlx= evt.getXOnScreen()-(location().x-12); 
int nly= evt.getYOnScreen()-(location().y-32); 

     setSize(nlx,nly); 
setBackground(new Color(0, 0, 0, 0)); 
invalidate(); 
    }else{ 
    setLocation (evt.getXOnScreen()-posX,evt.getYOnScreen()-posY); 

    } 

} 
}); 
} 
+1

Voir aussi cette [réponse] (http://stackoverflow.com/a/2784584/230513) en réponse à cette [question] (http://stackoverflow.com/q/2780780/230513). – trashgod

Répondre

2

J'ai fait une chose similaire avec un Jframe, je suis autour de lui en ajoutant 4 boutons très minces autour de l'extérieur de mon JFrame, et a utilisé le mousePressed et mouseDragged écoute des boutons pour contrôler le redimensionnement DFrame, il a travaillé dehors assez doucement.

L'auditeur mousePressed nous permet d'obtenir la position de départ pour que je puisse calculer la distance que le cadre est traîné/redimensionnée

Si vous voulez économiser sur les ressources que vous devez redimensionner tous les composants de l'enfant lorsque la souris est relâché pas quand il est déplacé

Edit: Exemple de redimensionnement de l'image sur l'axe X.

public class NewJFrame extends javax.swing.JFrame 
{ 
    //demo locations 
    int X1 = 0; 
    int X2 = 0; 

    public NewJFrame() 
    { 
    initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    private void initComponents() { 

     ResizeEast = new javax.swing.JButton(); 
     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setUndecorated(true); 

     ResizeEast.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mousePressed(java.awt.event.MouseEvent evt) { 
       ResizeEastMousePressed(evt); 
      } 
      public void mouseReleased(java.awt.event.MouseEvent evt) { 
       ResizeEastMouseReleased(evt); 
      } 
     }); 
     ResizeEast.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
      public void mouseDragged(java.awt.event.MouseEvent evt) { 
       ResizeEastMouseDragged(evt); 
      } 
     }); 

     jButton1.setText("Close"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jButton1) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 320, Short.MAX_VALUE) 
       .addComponent(ResizeEast, javax.swing.GroupLayout.PREFERRED_SIZE, 11, javax.swing.GroupLayout.PREFERRED_SIZE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jButton1) 
       .addContainerGap(266, Short.MAX_VALUE)) 
      .addComponent(ResizeEast, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) 
     ); 

     pack(); 
    } 

    private void ResizeEastMousePressed(java.awt.event.MouseEvent evt) 
    { 
    //set mosuepressed location to X1 and Y1 
    X1 = evt.getX(); 
    } 

    private void ResizeEastMouseReleased(java.awt.event.MouseEvent evt) 
    { 
    //update the location and size of all child components 
    } 

    private void ResizeEastMouseDragged(java.awt.event.MouseEvent evt) 
    { 
    //resize jframe on the fly 
    X2 = evt.getX(); 
    //set minimum size to 100 wide 
    if ((getWidth() - (X1 - X2)) < 100) 
    { 
     X2 = X1; 
    } 

    //resize east side only 
    this.setSize(getWidth() - (X1 - X2), getHeight()); 
    } 

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
    { 
    System.exit(0); 
    } 

    public static void main(String args[]) 
    { 
    java.awt.EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
     new NewJFrame().setVisible(true); 
     } 
    }); 
    } 
    // Variables 
    private javax.swing.JButton ResizeEast; 
    private javax.swing.JButton jButton1; 
} 

pour le reformatage des coins créer petits boutons de coin qui redimensionnent X et Y comme ceci: YourFrame.setSize(getWidth() - (X1 - X2), getHeight() - (Y1 - Y2));

+0

Avez-vous encore le projet? J'aimerais beaucoup voir un exemple de la façon dont vous l'avez fait. – Zakukashi

+0

Je ne l'ai pas désolé, mais j'ai ajouté un exemple de base que vous pouvez compiler – sorifiend

+0

Merci beaucoup pour l'aide, je vais essayer dès que je rentre à la maison – Zakukashi

2

Voici un adaptateur de souris complet j'utilise depuis longtemps maintenant:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

/** 
* @see http://stackoverflow.com/a/12456113/909085 
*/ 

public class WindowResizeAdapter extends MouseAdapter implements SwingConstants 
{ 
    private boolean resizing = false; 
    private int prevX = -1; 
    private int prevY = -1; 

    private int resizeSide = 0; 

    public static void install (Component component, int resizeSide) 
    { 
     WindowResizeAdapter wra = new WindowResizeAdapter (resizeSide); 
     component.addMouseListener (wra); 
     component.addMouseMotionListener (wra); 
    } 

    public WindowResizeAdapter (int resizeSide) 
    { 
     super(); 
     this.resizeSide = resizeSide; 
    } 

    public void mousePressed (MouseEvent e) 
    { 
     if (SwingUtilities.isLeftMouseButton (e)) 
     { 
      resizing = true; 
     } 
     prevX = e.getXOnScreen(); 
     prevY = e.getYOnScreen(); 
    } 

    public void mouseDragged (MouseEvent e) 
    { 
     if (prevX != -1 && prevY != -1 && resizing) 
     { 
      Window w = SwingUtilities.getWindowAncestor (e.getComponent()); 
      Rectangle rect = w.getBounds(); 

      Dimension dim; 
      boolean undecorated; 
      if (w instanceof JDialog) 
      { 
       dim = ((JDialog) w).getContentPane().getPreferredSize(); 
       undecorated = ((JDialog) w).isUndecorated(); 
      } 
      else if (w instanceof JFrame) 
      { 
       dim = ((JFrame) w).getContentPane().getPreferredSize(); 
       undecorated = ((JFrame) w).isUndecorated(); 
      } 
      else 
      { 
       dim = w.getPreferredSize(); 
       undecorated = true; 
      } 

      // Checking for minimal width and height 
      int xInc = e.getXOnScreen() - prevX; 
      int yInc = e.getYOnScreen() - prevY; 
      if (undecorated) 
      { 
       if (resizeSide == SwingConstants.NORTH_WEST || resizeSide == SwingConstants.WEST || 
         resizeSide == SwingConstants.SOUTH_WEST) 
       { 
        if (rect.width - xInc < dim.width) 
        { 
         xInc = 0; 
        } 
       } 
       else if (resizeSide == SwingConstants.NORTH_EAST || 
         resizeSide == SwingConstants.EAST || 
         resizeSide == SwingConstants.SOUTH_EAST) 
       { 
        if (rect.width + xInc < dim.width) 
        { 
         xInc = 0; 
        } 
       } 
       if (resizeSide == SwingConstants.NORTH_WEST || 
         resizeSide == SwingConstants.NORTH || 
         resizeSide == SwingConstants.NORTH_EAST) 
       { 
        if (rect.height - yInc < dim.height) 
        { 
         yInc = 0; 
        } 
       } 
       else if (resizeSide == SwingConstants.SOUTH_WEST || 
         resizeSide == SwingConstants.SOUTH || 
         resizeSide == SwingConstants.SOUTH_EAST) 
       { 
        if (rect.height + yInc < dim.height) 
        { 
         yInc = 0; 
        } 
       } 
      } 

      // Resizing window if any changes are done 
      if (xInc != 0 || yInc != 0) 
      { 
       if (resizeSide == SwingConstants.NORTH_WEST) 
       { 
        w.setBounds (rect.x + xInc, rect.y + yInc, rect.width - xInc, 
          rect.height - yInc); 
       } 
       else if (resizeSide == SwingConstants.NORTH) 
       { 
        w.setBounds (rect.x, rect.y + yInc, rect.width, rect.height - yInc); 
       } 
       else if (resizeSide == SwingConstants.NORTH_EAST) 
       { 
        w.setBounds (rect.x, rect.y + yInc, rect.width + xInc, rect.height - yInc); 
       } 
       else if (resizeSide == SwingConstants.WEST) 
       { 
        w.setBounds (rect.x + xInc, rect.y, rect.width - xInc, rect.height); 
       } 
       else if (resizeSide == SwingConstants.EAST) 
       { 
        w.setBounds (rect.x, rect.y, rect.width + xInc, rect.height); 
       } 
       else if (resizeSide == SwingConstants.SOUTH_WEST) 
       { 
        w.setBounds (rect.x + xInc, rect.y, rect.width - xInc, rect.height + yInc); 
       } 
       else if (resizeSide == SwingConstants.SOUTH) 
       { 
        w.setBounds (rect.x, rect.y, rect.width, rect.height + yInc); 
       } 
       else if (resizeSide == SwingConstants.SOUTH_EAST) 
       { 
        w.setBounds (rect.x, rect.y, rect.width + xInc, rect.height + yInc); 
       } 
       prevX = e.getXOnScreen(); 
       prevY = e.getYOnScreen(); 
      } 
     } 
    } 

    public void mouseReleased (MouseEvent e) 
    { 
     resizing = false; 
    } 
} 

Il suffit d'utiliser la méthode « installer » pour ajouter le comportement de redimensionnement de la fenêtre à un composant. La variable resizeSide est utilisée pour définir quel côté de la fenêtre doit être redimensionné (par exemple, SwingConstants.SOUTH_EAST force le composant à redimensionner le coin inférieur droit de la fenêtre).

Modifier: Vous pouvez également modifier le code de votre cas spécifique afin que la fonction glisser (redimensionner) ne démarre qu'à partir d'une zone spécifique du composant. Il suffit de modifier la méthode mousePressed pour le faire.

+0

difficile de dire quoi que ce soit, [mais ???? ] (http://tips4java.wordpress.com/?s=componentmover) – mKorbel

Questions connexes