Получение размера элемента управления Menu в Java SWT - PullRequest
2 голосов
/ 15 мая 2011

Как получить высоту элемента управления строки меню в окне оболочки Java SWT?

Кажется, что разные ОС имеют разную высоту для строки меню в верхней части окна оболочки. Так что было бы здорово, если бы я мог получить точную высоту строки меню. В API меню нет функции getSize ().

Ответы [ 2 ]

3 голосов
/ 15 мая 2011

Вы можете использовать /*public*/ Rectangle getBounds () из org.eclipse.swt.widgets.Menu. Но проблема в том, что метод имеет доступность по умолчанию . Его подпись предполагает, что когда-то это было public в некоторый доисторический период. В любом случае, есть много способов решить вашу проблему:

  1. Нахождение height of the shell и вычитания height of title area и height of client area. Проблема how to find the title area height?
  2. Второй способ такой же извилистый, как и первый. Используйте вышеупомянутый API с помощью Java Reflection. Посмотрите код ниже для более подробной информации. Специально метод static int getMenuHeight(Menu parent).

Note: Параметр parent Menu должен быть topmost и экземпляром меню visible . Потому что в некоторых ОС скрытые подменю создаются на лету. Кроме того, API тестируется на компьютере под управлением Vista, на котором запущено Eclipse 3.62 с SUN JDK 1.6_b18.

>>Code:

import java.lang.reflect.Method;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

public class MenuTest {

    public static void main (String [] args) 
    {
        Display display = new Display ();
        final Shell shell = new Shell (display);
        final Menu bar = new Menu (shell, SWT.BAR);
        shell.setMenuBar (bar);

        final Composite c = new Composite(shell, SWT.NONE);
        c.setLayout(new GridLayout());
        c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,true));

        MenuItem fileItem = new MenuItem (bar, SWT.CASCADE);
        fileItem.setText ("&File");
        Menu submenu = new Menu (shell, SWT.DROP_DOWN);
        fileItem.setMenu (submenu);
        MenuItem item = new MenuItem (submenu, SWT.PUSH);
        item.addListener (SWT.Selection, new Listener () {
            public void handleEvent (Event e) {
                System.out.println(shell.getSize().y -  shell.getClientArea().height);
                System.out.println(getMenuHeight(bar));
            }
        });


        item.setText ("Select &All\tCtrl+A");
        item.setAccelerator (SWT.MOD1 + 'A');
        shell.setSize (200, 200);
        shell.open ();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }

    static int getMenuHeight(Menu parent)
    {
        try {
            Method m = Menu.class.getDeclaredMethod("getBounds", null);
            m.setAccessible(true);
            Rectangle r = (Rectangle) m.invoke(parent, null);
            return r.height;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
} 
0 голосов
/ 15 мая 2011

Чтобы получить это, вы должны получить высоту строки меню и строки заголовка и вычесть высоту строки заголовка.

int menuTitleHeight = x.getWindow().getHeight() - x.getWindow().getContentPane().getHeight();
int titleHeight = x.getWindow().getHeight() - x.getWindow().getRootPane().getHeight();
int menuHeight = x.getWindow().getHeight() - x.getWindow().getRootPane().getHeight(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...