【问题标题】:How do I control the size of this shell without it being overridden?如何在不被覆盖的情况下控制这个 shell 的大小?
【发布时间】:2015-07-14 19:54:56
【问题描述】:

我需要一些 SWT 帮助。

我用多个获取文本标签构建了这个 shell。标签控制外壳的大小,但我希望外壳为 250x200 像素。我在打开外壳之前设置了尺寸。如何防止它被覆盖?我希望最终能够放入 1000 行并能够向下滚动,而不是拥有一个我无法做任何事情的巨大窗口。

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Color;

public class JavaLabelTable {

private Label status;
private Display display;
private Shell shell = new Shell(display, SWT.DIALOG_TRIM | SWT.CENTER | SWT.V_SCROLL);

public JavaLabelTable(Display display)
{
    initUT(display);
}

public void initUT(Display display)
{
    int q = 110;
    int w = 40;
    int e = q - w;
    int i;
    int y = 120;
    int b = 1;
    int c = 1;
    shell.setLayout(new GridLayout(3, false));
    Label RegisterLabels[] = new Label[y];
    status = new Label(shell, SWT.BORDER); 
    GridData gd2 = new GridData(SWT.FILL, SWT.FILL, true, true);   
    status.setLayoutData(gd2);
    gd2.widthHint = q;
    gd2.heightHint = 15;
    gd2.horizontalSpan = 3;

    for(i=1; i<y; i++)
    {
        if(i % 3 == 1)
        {
            GridData gd1 = new GridData(SWT.FILL, SWT.FILL, true, true);
            RegisterLabels[i] = new Label(shell, SWT.NONE);
            RegisterLabels[i].setLayoutData(gd1);
            RegisterLabels[i].setAlignment(SWT.CENTER);
            gd1.widthHint = w;
            gd1.horizontalSpan = 1;
            RegisterLabels[i].setText(Integer.toString(b));
            b++;
        }
        else
        {
            if(i % 3 == 2)
            {
                GridData gd1 = new GridData(SWT.FILL, SWT.FILL, true, true);
                RegisterLabels[c] = new Label(shell, SWT.BORDER);
                RegisterLabels[c].setLayoutData(gd1);
                RegisterLabels[c].setAlignment(SWT.CENTER);
                Color col1 = new Color(display, 255, 255, 255);
                RegisterLabels[c].setBackground(col1);
                gd1.widthHint = e;
                gd1.horizontalSpan = 1;
                RegisterLabels[c].getText();
                c++;
            }
            else
            {
                GridData gd1 = new GridData(SWT.FILL, SWT.FILL, true, true);
                RegisterLabels[i] = new Label(shell, SWT.NONE);
                RegisterLabels[i].setLayoutData(gd1);
                RegisterLabels[i].setAlignment(SWT.CENTER);
                gd1.widthHint = 20;
                gd1.horizontalSpan = 1;

            }
        }
    }

    shell.setSize(250, 200);
    status.getText();    
    shell.setText("Running");
    shell.pack();
    centerWindow(shell);
    shell.open();   


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

private void centerWindow(Shell shell) 
{

    Rectangle bds = shell.getDisplay().getBounds();

    Point p = shell.getSize();

    int nLeft = (bds.width - p.x) / 2;
    int nTop = (bds.height - p.y) / 2;

    shell.setBounds(nLeft, nTop, p.x, p.y);
}

@SuppressWarnings("unused")
public static void main(String[] args) {

    Display display = new Display();
    JavaLabelTable ex = new JavaLabelTable(display);
    display.dispose();
}    
}

【问题讨论】:

    标签: java shell swt


    【解决方案1】:

    不要调用shell.pack() - 这会将 Shell 的大小设置为根据其内容大小确定的“首选”大小。

    pack() 等价于:

    setSize(computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
    

    【讨论】:

    • 谢谢。我确实把它拿出来了,但窗口最终缩小了外壳内的内容。我已经指定了标签大小,但是让窗口变小会调整其中的所有内容。如何锁定外壳内内容的大小?
    • 使用 GridLayout 之类的东西的目的是在调整外壳大小时调整控件的大小。无论如何,您应该在这里使用Table,而不是尝试使用标签重新创建它。
    • 我以前试过。我很难让 asyncexec 使用它。所以我走了这条路。但我可以再试一次。至少表格会自动创建一个滚动条。
    猜你喜欢
    • 2021-12-17
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2021-04-21
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多