SWT菜单导致布局剪辑

时间:2011-10-13 08:58:15

标签: swt

我第一次尝试使用SWT,我无法弄清楚如何使用菜单栏以及任何空间填充布局。在不考虑菜单的情况下计算Composite的布局,因此一旦添加了Menu,布局的底部就会被剪裁。

令人惊讶的是,当用户调整大小时,会考虑菜单并且布局正常。但我无法弄清楚如何以编程方式修复它; 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 个答案:

答案 0 :(得分:3)

在我完成问题时,我想出了一个解决方案。我需要在 shell.layout()之后调用shell.open() ,以便GTK可以在SWT计算可用的布局空间之前呈现菜单。

答案 1 :(得分:0)

添加到yonran的答案:

如果使用JFace和ApplicationWindow的子类作为主要入口点,则会为您执行shell.open()。因此,不必使用JFace阻塞applicationWindow.open()方法调用,而是必须使用典型的SWT循环。

JFace之前(没有工作,并且有问题描述的剪辑问题):

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();
}