Установка размера внутренней области окна оболочки Java SWT - PullRequest
1 голос
/ 14 мая 2011

Как в окне оболочки Java SWT установить его внутренний размер, а не весь размер рамки окна?

Например, если я использую shell.setSize (300, 250), все окно будет выглядеть точно как 300x250. Это 300x250 включает в себя размер оконной рамы.

Как я могу установить внутренний размер, то есть область отображения содержимого окна оболочки вместо 300x250? Вот это 300х250 исключает ширину оконной рамы.

Я пытался исключить некоторые значения смещения, но дело в том, что разные операционные системы имеют разные размеры оконных рам. Поэтому постоянное смещение не будет точным.

Спасибо.

Ответы [ 3 ]

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

Из вашего вопроса я понял, что вы хотите установить размер Client Area.А в языке SWT он определяется как a rectangle which describes the area of the receiver which is capable of displaying data (that is, not covered by the "trimmings").

. Вы не можете напрямую установить размерность Client Area, поскольку для него нет API.Хотя вы можете добиться этого с помощью небольшого взлома.В приведенном ниже примере кода я хочу, чтобы моя клиентская область была 300 by 250.Для этого я использовал прослушиватель событий shell.addShellListener().Когда оболочка полностью активна (см. public void shellActivated(ShellEvent e)), тогда я вычисляю различные поля и снова устанавливаю размер моей оболочки.Расчет и сброс размера оболочки дает мне желаемый размер оболочки.

>>Code:

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 ();
    }
} 
0 голосов
/ 31 декабря 2016
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();
    }
}
0 голосов
/ 14 мая 2011

Если я правильно понял, вы должны установить размер внутреннего компонента на нужный размер и использовать метод pack() (кадра).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...