【问题标题】:Modify Listener on Text Field修改文本字段上的侦听器
【发布时间】:2014-11-05 22:10:48
【问题描述】:

我在文本字段上添加了一个修改侦听器,当我尝试打开对话框时,它会触发修改侦听器事件并在打开对话框之前给出空指针异常

这是我的代码

 UserNameDialog dialog = new UserNameDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), true);
    dialog.init("", userSession.hasAdminRights(), false, true, false, "");
    dialog.open();
    if (dialog.getReturnCode() == Window.CANCEL) {
        return;
    }   

对话框类

public class UserNameDialog extends TitleAreaDialog {
private Text txtUsername;
@Override
protected Control createDialogArea(Composite parent) {
    setMessage("Enter user information and press OK");
    setTitle("User Information");
    Composite area = (Composite) super.createDialogArea(parent);
    Composite container = new Composite(area, SWT.NONE);
    container.setLayout(new GridLayout(2, false));
    container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

    Label lblUserName = new Label(container, SWT.NONE);
    lblUserName.setText("User name");

    txtUsername = new Text(container, SWT.BORDER);
    txtUsername.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
    txtUsername.addListener(SWT.Modify, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            getButton(IDialogConstants.OK_ID).setEnabled(isValidUsername());
            // As I try to open the dialog the handler comes here and throws exception on 
            // getButton(IDialogConstants.OK_ID)
        }

    });
    if(newUser || currentUserisAdmin)
        txtUsername.setEditable(true);
    else
        txtUsername.setEditable(false);
    txtUsername.setText(name);

    new Label(container, SWT.NONE);
    new Label(container, SWT.NONE);

    return area;
}

/**
 * Create contents of the button bar.
 * @param parent
 */
@Override
protected void createButtonsForButtonBar(Composite parent) {
     okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
     createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
     okButton.setEnabled(false);
}

private boolean isValidUsername()
{
    String username = txtUsername.getText();
    return username != null && username.trim().length() > 0;
}
}       

它在一个对话框中,但我认为它在创建对话框之前被调用,因为 okButton 为空

【问题讨论】:

  • 您的代码看起来还不错。您确定没有调用侦听器,或者只是因为您的if 检查而没有调用enableOkButton
  • 它很好,但我无法在文本字段上添加 ModifyListener 它给了我空指针异常
  • 您必须发布执行此操作的代码。
  • 代码添加到问题中
  • 好的,最后:请发布堆栈跟踪并指出引发异常的行。

标签: java radio-button swt selection


【解决方案1】:

好的,这是一个对话框示例,如果用户名至少有一个字符长,则该对话框将启用“确定”按钮:

private Text text;

protected UsernameDialog(Shell parentShell)
{
    super(parentShell);
}

@Override
protected void configureShell(Shell newShell)
{
    super.configureShell(newShell);
    newShell.setText("Dialog");
}

@Override
protected Control createDialogArea(Composite parent)
{
    Composite container = (Composite) super.createDialogArea(parent);
    text = new Text(container, SWT.BORDER);
    text.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
    text.addListener(SWT.Modify, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            getButton(IDialogConstants.OK_ID).setEnabled(isValidUsername());
        }
    });

    return container;
}

private boolean isValidUsername()
{
    String username = text.getText();
    return username != null && username.trim().length() > 0;
}

@Override
protected void okPressed()
{
    if (isValidUsername())
        super.okPressed();
    else
        System.out.println("Invalid username");
}

@Override
protected void createButtonsForButtonBar(Composite parent)
{
    createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
    createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);

    getButton(IDialogConstants.OK_ID).setEnabled(false);
}

public static void main(String[] args)
{
    new UsernameDialog(new Shell()).open();
}

【讨论】:

  • 是的,getButton(IDialogConstants.OK_ID) 为空,当我点击按钮打开对话框时触发事件
  • @wearybands 您是否也像我发布的那样在createButtonsForButtonBar 方法中创建按钮?请发布整个对话类。某处肯定存在复制/粘贴问题,因为我发布的代码在这里完美运行。
  • 我添加了 createButton 方法,因为您提供的仍然是空指针异常
  • 当我从文本字段中删除监听器时,我可以打开对话框,当监听器在那里时,它会在打开对话框之前给出异常
  • @wearybands 正如我所说,您必须发布对话的代码。
【解决方案2】:

首先感谢 Baz 的帮助。我发布了所有相关代码,但我无法弄清楚为什么您的解决方案不起作用。我所做的和为我工作的如下

 txtUsername.addKeyListener(new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {
            updateOKButton();
        }
    });


@Override
protected void createButtonsForButtonBar(Composite parent) {
     okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
     createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
     okButton.setEnabled(false);
}


private void updateOKButton() {
    if(newUser){    
        if(txtUsername.getText() == null || txtUsername.getText().isEmpty()){
            this.setMessage("Username can not be empty!");
            okButton.setEnabled(false);
        }
        else if(txtPassword.getText().isEmpty() && txtPassword_1.getText().isEmpty()){
            this.setMessage("Passwords cannot be null!");
            okButton.setEnabled(false);
        }
        else if (!(txtPassword.getText().equals(txtPassword_1.getText()))) {
            this.setMessage("Password do not match!");
            okButton.setEnabled(false);     
        }else {
            this.setMessage(null);
            okButton.setEnabled(true);
        }
    }
    else{
        if(txtUsername.getText() == null || txtUsername.getText().isEmpty()){
            this.setMessage("Username can not be empty!");
            okButton.setEnabled(false);
        }
        else {
            this.setMessage(null);
            okButton.setEnabled(true);
        }
    }
}

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2013-09-10
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    相关资源
    最近更新 更多