2008-12-04 8 views
8

Je suis en train d'implémenter un clavier à l'écran en Java pour SWT et AWT. Une chose importante est de déplacer le clavier à une position où le champ de texte sélectionné peut apparaître et ne se trouve pas derrière le clavier à l'écran.Trouver l'emplacement composite sur l'écran

Pour AWT i peut détecter la position du composant actuellement sélectionné avec

Component owner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); 
if (owner == null) { 
    return; 
} 
Point ownerLocation = owner.getLocationOnScreen(); 
Dimension ownerSize = owner.getSize(); 

Comment puis-je mettre en œuvre la même logique dans SWT? Je reçois le widget sélectionné en ajoutant un focuslistener à la file d'attente d'événements SWT. Mais quand j'appelle

Point location = new Point(mTextWidget.getLocation().x, mTextWidget.getLocation().y); 
Dimension dimension = new Dimension(mTextWidget.getSize().x, mTextWidget.getSize().y); 

Je vais obtenir la position relativ au composite parent.

Comment puis-je obtenir l'emplacement d'un widget spécial par rapport à l'écran complet?

Répondre

16

Je crois que la méthode Control.toDisplay() devrait être capable de traduire vos coordonnées en celles relatives à l'écran.

Ce snippet peut illustrer ce que vous recherchez:

package org.eclipse.jface.snippets; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.graphics.Rectangle; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Text; 

public class Bla { 
    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 

     final Text t = new Text(shell,SWT.BORDER); 
     t.setBounds(new Rectangle(10,10,200,30)); 
     System.err.println(t.toDisplay(1, 1)); 

     Button b = new Button(shell,SWT.PUSH); 
     b.setText("Show size"); 
     b.setBounds(new Rectangle(220,10,100,20)); 
     b.addSelectionListener(new SelectionAdapter() { 

      public void widgetSelected(SelectionEvent e) { 
       System.err.println(t.toDisplay(1, 1)); 
      } 

     }); 

     shell.open(); 

     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 

     display.dispose(); 
    } 
} 
+0

parfait, voilà ce que je cherche. merci –

+0

Merci, mon pote! Votre réponse a mis fin à une matinée de douleur. –

+0

@Mario: De rien. Heureux d'avoir pu aider. – VonC

Questions connexes