我正在尝试实现一个简单的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并设置旧的大小,用户会注意到调整大小,这对我来说非常不满意。
所以你知道吗,我可以调用哪种方法来更新窗口,就像我调整大小时一样?但是这样窗口的大小保持不变?
谢谢!
编辑:如果我在开头设置标签并将其设置为不可见,您会注意到有以下内容: 示例:此图片显示窗口部件,但未创建标签并将其设置为不可见
此图显示了创建标签并将其设置为不可见的窗口部分:
我更喜欢第1版。
答案 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)
,其中使用布尔参数来指示内容已更改。