سؤال

أقوم بتنفيذ لوحة مفاتيح على الشاشة في Java لـ SWT و AWT. أحد الأشياء المهمة هو نقل لوحة المفاتيح إلى موضع يمكن أن يظهر فيه حقل النص المحدد ولا يكذب وراء لوحة المفاتيح على الشاشة.

بالنسبة لـ AWT ، يمكنني اكتشاف موضع المكون المحدد الحالي مع

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

كيف يمكنني تنفيذ نفس المنطق في SWT؟ أحصل على عنصر واجهة مستخدم محددة حالية عن طريق إضافة قائمة FocusListener إلى قائمة انتظار حدث SWT. لكن عندما أتصل

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

سأحصل على الموقف النسبي إلى المركب الأصل.

كيف يمكنني الحصول على موقع عنصر واجهة مستخدم خاص إلى الشاشة الكاملة؟

هل كانت مفيدة؟

المحلول

أعتقد أن الطريقة control.todisplay () يجب أن تكون قادرة على ترجمة إحداثياتك إلى تلك المتعلقة بالشاشة.

هذه مقتطف قد توضح ما أنت عليه بعد:

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();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top