2008-12-04 17 views
8

Ich implementiere eine Bildschirmtastatur in Java für SWT und AWT. Eine wichtige Sache ist, die Tastatur in eine Position zu bewegen, wo das ausgewählte Textfeld angezeigt werden kann und nicht hinter der Bildschirmtastatur liegt.Composite-Position auf dem Bildschirm suchen

Für AWT kann ich die Position der aktuell ausgewählten Komponente mit

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

erfassen Wie kann ich die gleiche Logik in SWT implementieren? Ich erhalte das aktuell ausgewählte Widget, indem ich der SWT-Ereigniswarteschlange einen Fokuslistener hinzufüge. Aber wenn ich rufe

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

Ich werde die Position relativ zum übergeordneten Verbund erhalten.

Wie kann ich den Standort eines speziellen Widgets relativ zum vollständigen Bildschirm erhalten?

Antwort

16

Ich glaube, die Methode Control.toDisplay() sollte in der Lage sein, Ihre Koordinaten in eine relativ zum Bildschirm zu übersetzen.

Diese snippet kann zeigen, was Sie nach:

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

Perfect, das ist, was für im suchen. danke –

+0

Danke, Kumpel! Deine Antwort beendete ein Morgen des Schmerzes. –

+0

@Mario: Gern geschehen. Froh, dass ich helfen konnte. – VonC