设置Java SWT外壳窗口内部区域的大小

设置Java SWT外壳窗口内部区域的大小,java,swt,Java,Swt,在JavaSWTShell窗口中,如何设置其内部大小而不是整个窗口框架大小 例如,如果我使用shell.setSize(300250),这将使整个窗口显示为300x250。此300x250包括窗框的尺寸 如何将内部大小(即shell窗口的内容显示区域)设置为300x250?这就是300x250不包括窗框的宽度 我试图减去一些偏移值,但问题是不同的操作系统有不同的窗口框架大小。所以有一个恒定的偏移量是不准确的 谢谢。如果我答对了,您应该将内部组件的大小设置为所需的大小,并使用pack()(框架的)

在JavaSWTShell窗口中,如何设置其内部大小而不是整个窗口框架大小

例如,如果我使用shell.setSize(300250),这将使整个窗口显示为300x250。此300x250包括窗框的尺寸

如何将内部大小(即shell窗口的内容显示区域)设置为300x250?这就是300x250不包括窗框的宽度

我试图减去一些偏移值,但问题是不同的操作系统有不同的窗口框架大小。所以有一个恒定的偏移量是不准确的


谢谢。

如果我答对了,您应该将内部组件的大小设置为所需的大小,并使用
pack()
(框架的)方法。

从您的问题中,我了解到您想要设置
客户区的尺寸。在SWT行话中,它被定义为
一个矩形,用于描述能够显示数据的接收器区域(即,不包括在“微调”中)。

您不能直接设置
客户端区域的维度,因为它没有API。虽然你可以通过一些小技巧来实现这一点。在下面的示例代码中,我希望我的客户区是300×250。为了实现这一点,我使用了
shell.addShellListener()
事件监听器。当shell完全激活时(请参见
public void shellActivated(ShellEvent e)
),我会计算不同的边距,然后再次设置shell的大小。外壳尺寸的计算和重置为我提供了所需的外壳尺寸

>代码:

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
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);

        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.horizontalSpacing = 0;
        layout.verticalSpacing = 0;
        layout.numColumns = 1;
        shell.setLayout(layout);
        shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,true));
        final Menu bar = new Menu (shell, SWT.BAR);
        shell.setMenuBar (bar);

        shell.addShellListener(new ShellListener() {

            public void shellIconified(ShellEvent e) {
            }
            public void shellDeiconified(ShellEvent e) {
            }
            public void shellDeactivated(ShellEvent e) {
            }
            public void shellClosed(ShellEvent e) {
                System.out.println("Client Area: " + shell.getClientArea());
            }
            public void shellActivated(ShellEvent e) {
                int frameX = shell.getSize().x - shell.getClientArea().width;
                int frameY = shell.getSize().y - shell.getClientArea().height;
                shell.setSize(300 + frameX, 250 + frameY);
            }
        });     

        shell.open ();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
        display.dispose ();
    }
} 

我在画面的顶部有一个菜单控件。包()不考虑菜单栏的额外高度,而只考虑框架中的内容。如何获取菜单栏的高度,还是让包()考虑菜单栏的大小?谢谢你的帮助。你的例子非常有用!非常感谢。请添加一些描述答案的评论,并回答所问的具体问题。在StackOverflow上,纯代码答案是不受欢迎的
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

public class SWTClientAreaTest
{
    Display display;
    Shell shell;
    final int DESIRED_CLIENT_AREA_WIDTH = 300;
    final int DESIRED_CLIENT_AREA_HEIGHT = 200;

    void render()
    {
        display = Display.getDefault();
        shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);

        Point shell_size = shell.getSize();
        Rectangle client_area = shell.getClientArea();

        shell.setSize
        (
            DESIRED_CLIENT_AREA_WIDTH + shell_size.x - client_area.width,
            DESIRED_CLIENT_AREA_HEIGHT + shell_size.y - client_area.height
        );

        shell.open();

        while (!shell.isDisposed()) 
        {
            if (!display.readAndDispatch()) 
            {
                display.sleep();
            }
        }

        display.dispose();
    }

    public static void main(String[] args)
    {
        SWTClientAreaTest appl = new SWTClientAreaTest();
        appl.render();
    }
}