Установка размера внутренней области окна оболочки Java SWT

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

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

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

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

Благодарю.

4 ответа

Решение

Из вашего вопроса я понял, что вы хотите установить размер Client Area, И в SWT Lingo это определяется как 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 ();
    }
} 

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

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

Использовать computeTrimдля вычисления границ, необходимых для отображения данной клиентской области. Метод возвращает прямоугольник, описывающий границы, необходимые для предоставления места для клиентской области, указанной в аргументах.

В этом примере размер оболочки установлен таким образом, чтобы он мог отображать клиентскую область размером 100 x 200 (ширина x высота):

      Rectangle bounds = shell.computeTrim(0, 0, 100, 200);
shell.setSize(bounds.width, bounds.height);

В этой статье описаны термины, используемые SWT для размеров виджета:https://www.eclipse.org/articles/Article-Understanding-Layouts/Understanding-Layouts.htm

Другие вопросы по тегам