疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Eclipse工具开发:访问对话框中的值


 

在程序中经常会弹出一些对话框,要求用户输入一些值,然后根据用户输入的值来进行后续操作。比如在程序中弹出一个对话框要求用户输入姓名和国家,然后根据输入的值显示问候语。
   
    定义SettingDialog类:
   
    public class SettingDialog extends Dialog
   
    {
   
    private Text txtName;
   
    private Text txtCountry;
   
    …
   
    public String getName()
   
    {
   
    return txtName.getText();
   
    }
   
    public String getCountry()
   
    {
   
    return txtCountry.getText();
   
    }
   
    }
   
    主界面:
   
    SettingDialog dlg = … ;
   
    dlg.open();
   
    if(dlg.open()==Window.OK)
   
    {
   
    MessageDialog.openInformation(shell, "", dlg.getName()+" is from "+
   
    dlg.getCountry());
   
    }
   
    当运行的时候就会抛出如下异常:
   
    org.eclipse.swt.SWTException: Widget is disposed
   
    这是为什么呢?
   
    让我们来看一下 org.eclipse.jface.window.Window类,它是SettingDialog的间接父类,在Window类的close方法中将界面控件全部销毁掉了,当我们关闭一个界面的时候就调用了close方法,这样当窗口已经关闭的时候,我们再去调用dlg.getName()的话, getName方法就会去访问txtName控件,可是txtName已经被销毁掉了,不能被访问了,所以就抛出了Widget is disposed这个异常消息。
   
    那么我们应该怎么修改呢?既然不能在窗口关闭以后访问界面控件对象,那么只有在关闭之前来把要访问的控件值提前保存起来了。做如下修改:
   
    public class SettingDialog extends Dialog
   
    {
   
    private Text txtName;
   
    private Text txtCountry;
   
    private String name;
   
    private String country;
   
    …
   
    protected void okPressed()
   
    {
   
    name = txtName.getText();
   
    country = txtCountry.getText();
   
    super.okPressed();
   
    }
   
    public String getName()
   
    {
   
    return name;
   
    }
   
    public String getCountry()
   
    {
   
    return country;
   
    }
   
    }
   
    当单击【确定】按钮的时候,okPressed方法会被调用,我们在调用父类的okPressed之前将控件的值保存起来就可以了,并且改写了get方法,让它返回我们保存的值。