SWT-меню приводит к обрезке макета - PullRequest
1 голос
/ 13 октября 2011

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

Удивительно, но при изменении размера пользователя меню учитывается и макетхорошо.Но я не могу понять, как это исправить программно;shell.layout(true,true), shell.setSize(250,250), shell.pack() не решайте проблему.

Menu causes layout to clip.After resize, everything is fine.

package com.appspot.htmldoodads.pdfstuffs;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

public class MenuLayout {
    public static void main(String[] argv) {
        final Display display = new Display();
        final Shell shell = new Shell(display);

        GridLayout shellLayout = new GridLayout();
        shell.setLayout(shellLayout);

        // Add a menu bar with File -> Open...
        Menu bar = new Menu(shell, SWT.BAR);
        shell.setMenuBar(bar);
        MenuItem fileItem = new MenuItem(bar, SWT.CASCADE);
        fileItem.setText("&File");
        Menu subMenu = new Menu(shell, SWT.DROP_DOWN);
        fileItem.setMenu(subMenu);
        MenuItem openItem = new MenuItem(subMenu, SWT.CASCADE);
        openItem.setText("&Open...");

        // Add a button that fills the space.
        Button big = new Button(shell, SWT.PUSH);
        big.setText("Fill.");
        GridData bigLayoutData = new GridData(GridData.FILL, GridData.FILL, true, true);
        big.setLayoutData(bigLayoutData);

        // Add a button that doesn't fill space.
        new Button(shell, SWT.PUSH).setText("Regular");

        shell.layout(true, true);
        shell.setSize(250,250);
        shell.open();
        while ( ! shell.isDisposed ()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Я придумал решение, как только заканчивал вопрос. Мне нужно было позвонить shell.layout() после shell.open(), чтобы GTK мог отобразить меню до того, как SWT рассчитает доступное пространство для макета.

0 голосов
/ 27 февраля 2013

Добавление к ответу Йонрана:

Если вы используете JFace и подкласс ApplicationWindow в качестве основной точки входа, shell.open() выполняется для вас. Поэтому вместо использования вызова метода applicationWindow.open(), блокирующего JFace, вы должны использовать типичный цикл SWT.

JFace Before (не работал, и была описана проблема отсечения):

public static void main(String[] args) {
    ApplicationWindow window = new MyApplicationWindow("My Window Title");
    window.setBlockOnOpen(true);
    window.open();
    Display.getCurrent().dispose()
}

JFace After (корректно отображается без отсечения):

public static void main(String[] args) {
    ApplicationWindow window = new MyApplicationWindow("My Window Title");
    window.open();

    Shell shell = window.getShell();
    shell.layout(true, true);
    while (!shell.isDisposed())
        if (!Display.getCurrent().readAndDispatch())
            Display.getCurrent().sleep();
    Display.getCurrent().dispose();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...