2008-12-04 17 views
8

Estoy implementando un teclado en pantalla en Java para SWT y AWT. Una cosa importante es mover el teclado a una posición donde el campo de texto seleccionado puede mostrarse y no se encuentra detrás del teclado en pantalla.Buscar ubicación compuesta en la pantalla

Para AWT i puede detectar la posición del componente seleccionado actual con

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

¿Cómo puedo aplicar la misma lógica en SWT? Obtengo el widget seleccionado actual al agregar un oyente de enfoque a la cola de eventos de SWT. Pero cuando llamo a

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

Obtendré la posición relativ al compuesto primario.

¿Cómo puedo obtener la ubicación de un widget especial relacionado con la pantalla completa?

Respuesta

16

Creo que el método Control.toDisplay() debería ser capaz de traducir sus coordenadas a las relativas a la pantalla.

Este snippet pueden ilustrar lo que está buscando:

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

perfecto, esto es lo que estoy buscando. gracias –

+0

¡Gracias, amigo! Tu respuesta puso fin a una mañana de dolor. –

+0

@Mario: De nada. Me alegro de poder ayudar. – VonC

Cuestiones relacionadas