java - programacion - Buscar ubicación compuesta en la pantalla
manual de programacion android pdf (1)
Estoy implementando un teclado en pantalla en Java para SWT y AWT. Una cosa importante es mover el teclado a una posición donde se muestre el campo de texto seleccionado y que no se encuentre detrás del teclado en pantalla.
Para AWT, puedo 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 implementar la misma lógica en SWT? Obtengo el widget seleccionado actual al agregar un focuslistener a la cola de eventos de SWT. Pero cuando llamo
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 padre.
¿Cómo puedo obtener la ubicación de un widget especial relacionado con la pantalla completa?
Creo que el método Control.toDisplay () debería poder traducir tus coordenadas a las relativas a la pantalla.
Este fragmento puede ilustrar lo que busca:
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();
}
}