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