添加标签后更新swt窗口

时间:2014-03-26 15:45:11

标签: java resize swt eclipse-rcp

我正在尝试实现一个简单的SWT对话框,它有一个文本字段,如果输入的文本字段文本有问题,我想在文本字段底部的标签中显示此错误。

因此,在开始时,您只能看到填充整个窗口的文本字段。如果我显示标签,我会创建它并希望在文本字段的底部显示它。

我的问题是,你只有在调整窗口大小后才能看到这个标签(无论我是将它做得更小还是更大)都是如此。那么当我调整窗口大小时,在shell中调用哪个方法?

我试过了:

shell.layout();
shell.update();
shell.pack(); 
shell.redraw();
textField.update();
textField.redraw();

但没有改变。

所以唯一有效的可能性是:

Point oldSize = shell.getSize();
oldSize.x += 1;
shell.setSize(oldSize);
oldSize.x -= 1;
shell.setSize(oldSize);

但这不是一个可接受的解决方案,因为用户注意到shell的大小变化很小。我的问题与此类似:Java SWT added Label not visible(也是应用程序看起来非常相似),但在这个解决方案中使用pack并设置旧的大小,用户会注意到调整大小,这对我来说非常不满意。

所以你知道吗,我可以调用哪种方法来更新窗口,就像我调整大小时一样?但是这样窗口的大小保持不变?

谢谢!

编辑:如果我在开头设置标签并将其设置为不可见,您会注意到有以下内容: 示例:此图片显示窗口部件,但未创建标签并将其设置为不可见 Window part without creating label and setting it to invisible

此图显示了创建标签并将其设置为不可见的窗口部分: Window part with creating label and setting it to invisible

我更喜欢第1版。

3 个答案:

答案 0 :(得分:2)

请在下面尝试。我希望您正在寻找以下类型的功能。你可以根据需要修改keypress监听器。

public class demo {
    static Label lbl;
    static Shell shell;
    public static void main(String[] chr){
        Display display = new Display();


        shell = new Shell(display, SWT.SHELL_TRIM);
        final Text txt = new Text(shell,SWT.BORDER);


        shell.setLayout(new FillLayout(SWT.VERTICAL));
        shell.pack();
        shell.layout(true);
        shell.open();

        txt.addKeyListener(new KeyListener() {

            @Override
            public void keyReleased(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void keyPressed(KeyEvent arg0) {
                // TODO Auto-generated method stub


                if (lbl!=null)lbl.dispose();
                if(txt.getText().length()<5){
                    lbl= new Label(shell,SWT.NONE);
                    lbl.setText("text should be more than 5 character");

                }
                shell.redraw();
                shell.pack();
                shell.layout(true); 

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

答案 1 :(得分:1)

在这种情况下,最好的办法是在开头创建标签并隐藏它(Label#setVisible(false)),并在需要显示错误消息时启用可见性。

UPDATE1: 此外,您还可以在标签上添加布局数据,并将其设置为从布局中排除。这不会占用空的空间。

errorLabel = new Label(parent, SWT.NONE);
errorLabel.setVisible(false);
GridData gd = new GridData();
gd.exclude = true;
errorLabel.setLayoutData(gd);

当我们想要显示标签时,我们可以执行以下操作:

errorLabel.setVisible(true);
((GridData) errorLabel.getLayoutData()).exclude = false;
errorLabel.getParent().layout();

答案 2 :(得分:-1)

您应该调用layout(true),其中使用布尔参数来指示内容已更改。