essaie peut-être cela :

après avoir rendu visible la fenêtre
Insets ins = getInsets();

ensuite, quand tu veux positionner la fenêtre, soustrait ins.top et ins.left
aux coordonnées où tu souhaites placer la fenêtre

Anthony

-----Message d'origine-----
De : Herve AGNOUX [mailto:[EMAIL PROTECTED]]
Envoyé : Thursday, December 12, 2002 4:04 PM
À : [EMAIL PROTECTED]
Objet : Les environnements graphiques et swing


Bonjour,

C'est un peu la suite de mon problème avec TWM :-)

Je m'aperçois que je suis super ennuyé avec mon positionnement de fenêtre.
En 
fait, même KDE refuse de positionner ma fenêtre à l'endroit où je veux.

Je me suis fait un petit programme de test où je simule le paramètre
geometry, 
pour pouvoir placer une fenêtre n'importe où à l'écran. 

J'utilise setBounds pour placer la fenêtre, et getBounds pour relire sa 
position. Le getBounds est rarement égal au setBounds ! Et d'après le 
pifômètre, la valeur que me renvoie getBounds est juste.

A première vue, KDE à tendance à tout me décaler de 20 pixels vers le bas ;
si 
je veux positionner ma fenêtre en (0,0), il faut que je la positionne en 
(-4,-20).

Bref, qu'est ce que c'est que ce bazard !? Faut-il établir entre setBounds
et 
getBounds un correctif de gestion de marge ??? Connaissez-vous un pattern
???

Mon petit programme de test pour ceux que ça intéresse :

/*
 * TestGeometry.java
 *
 * Created on 12 décembre 2002, 11:58
 */

package beans;

import java.awt.*;

/**
 *
 * @author  herve
 */
public class TestGeometry extends javax.swing.JFrame
{
  
  /** Creates new form TestGeometry */
  public TestGeometry()
  {
    initComponents();
  }
  
  /** This method is called from within the constructor to
   * initialize the form.
   * WARNING: Do NOT modify this code. The content of this method is
   * always regenerated by the Form Editor.
   */
  private void initComponents()
  {
    jPanel1 = new javax.swing.JPanel();
    jpGeometry = new javax.swing.JPanel();
    jLabel1 = new javax.swing.JLabel();
    jtGeometry = new javax.swing.JTextField();
    jpPosition = new javax.swing.JPanel();
    jlPosition = new javax.swing.JLabel();
    jlErreur = new javax.swing.JLabel();

    getContentPane().setLayout(new java.awt.FlowLayout());

    addComponentListener(new java.awt.event.ComponentAdapter()
    {
      public void componentResized(java.awt.event.ComponentEvent evt)
      {
        formComponentResized(evt);
      }
      public void componentMoved(java.awt.event.ComponentEvent evt)
      {
        formComponentMoved(evt);
      }
    });

    addWindowListener(new java.awt.event.WindowAdapter()
    {
      public void windowClosing(java.awt.event.WindowEvent evt)
      {
        exitForm(evt);
      }
    });

    jPanel1.setLayout(new java.awt.GridLayout(3, 1));

    jLabel1.setText("-geometry : ");
    jpGeometry.add(jLabel1);

    jtGeometry.setColumns(10);
    jtGeometry.setText("XxY+/-?+/-?");
    jtGeometry.addActionListener(new java.awt.event.ActionListener()
    {
      public void actionPerformed(java.awt.event.ActionEvent evt)
      {
        jtGeometryActionPerformed(evt);
      }
    });

    jpGeometry.add(jtGeometry);

    jPanel1.add(jpGeometry);

    jlPosition.setText("x=?, y=?, l=?, h=?");
    jpPosition.add(jlPosition);

    jPanel1.add(jpPosition);

    jlErreur.setForeground(new java.awt.Color(255, 102, 102));
    jPanel1.add(jlErreur);

    getContentPane().add(jPanel1);

    pack();
  }

  private void jtGeometryActionPerformed(java.awt.event.ActionEvent evt)
  {
    // Add your handling code here:
    geometry(jtGeometry.getText());
  }

  private void formComponentResized(java.awt.event.ComponentEvent evt)
  {
    // Add your handling code here:
    affichePosition();
  }

  private void formComponentMoved(java.awt.event.ComponentEvent evt)
  {
    // Add your handling code here:
    affichePosition();
  }
  
  /** Exit the Application */
  private void exitForm(java.awt.event.WindowEvent evt)
  {
    System.exit(0);
  }
  
  
  // sans les regexp c'est pas facile...
  private void geometry(String elle)
  {
    Rectangle r;
    int i, ix, pp;
    String sw, sh, sTaille, sPosition, sPosX, sPosY;
    int iPosSignX, iPosSignY;
    
    r = new Rectangle();
    for (i = 0; i < elle.length(); i++)
      if ((elle.charAt(i) == '+') || (elle.charAt(i) == '-'))
        break;
    if (i == elle.length())
    {
      jlErreur.setText("Pas de +/- ?");
      return;
    }
    sTaille = elle.substring(0, i);
    sPosition = elle.substring(i);
    ix = sTaille.indexOf('x');
    if (ix < 0)
    {
      jlErreur.setText("pas de x ?");
      return;
    }
    sw = sTaille.substring(0, ix);
    r.width = Integer.parseInt(sw);
    sh = sTaille.substring(ix+1);
    r.height = Integer.parseInt(sh);
    for (pp = 1; pp < sPosition.length(); pp++)
    {
      if ((sPosition.charAt(pp) == '+') || (sPosition.charAt(pp) == '-'))
        break;      
    }
    if (pp == sPosition.length())
      jlErreur.setText("pas de position en Y ?");
    sPosX = sPosition.substring(1, pp);
    sPosY = sPosition.substring(pp+1);
    iPosSignX = 0;
    iPosSignY = pp;
    if (sPosition.charAt(iPosSignX) == '-')
      sPosX = "-"+sPosX;
    r.x = Integer.parseInt(sPosX);
    if (sPosition.charAt(iPosSignY) == '-')
      sPosY = "-"+sPosY;
    r.y = Integer.parseInt(sPosY);
System.out.println("r="+r);    
    setBounds(r);
  }
  
  private void affichePosition()
  {
    Rectangle r;
    
    r = getBounds();
    jlPosition.setText("x="+r.x+", y="+r.y+", l="+r.width+", h="+r.height);
  }
  
  /**
   * @param args the command line arguments
   */
  public static void main(String args[])
  {
    TestGeometry tg;
    boolean nok;
    
    tg = new TestGeometry();
    tg.show();
    nok = true;
System.out.println("-"+args.length);
    if (args.length == 2)
    {
      if ("-geometry".equals(args[0]))
      {
        tg.geometry(args[1]);
        nok = false;
      }
      
    }
    if (nok)
      System.out.println
      ("java beans.TestGeometry -geometry XxY+/-longueur+/-hauteur");
    tg.affichePosition();
  }
  
  
  // Variables declaration - do not modify
  private javax.swing.JPanel jpGeometry;
  private javax.swing.JTextField jtGeometry;
  private javax.swing.JLabel jLabel1;
  private javax.swing.JLabel jlPosition;
  private javax.swing.JLabel jlErreur;
  private javax.swing.JPanel jPanel1;
  private javax.swing.JPanel jpPosition;
  // End of variables declaration
  
}

-- 
SARL diaam informatique - 04 50 77 12 60
Ingenierie, développements de systèmes d'information
http://www.diaam-informatique.com

Répondre à