2013-03-28 72 views
0

我正在开发一个Java SWT程序,我需要一个登录表单来进行用户授权。如何在Java SWT中清除窗口历史记录?

我的程序的入口点是LoginWindow,当用户成功登录后,LoginWindow打开第二个窗口并隐藏它自己。当我关闭新窗口时,LoginWindow再次出现。如何阻止这种行为?

public class LoginWindow 
{ 
    private Display    display; 
    private Shell    shell; 

    private Text    widgetLogin; 
    private Text    widgetPass; 

    private DatabaseHelper  db; 
    private PreferenceHelper pref; 

    /** 
    * @wbp.parser.entryPoint 
    */ 
    public static void main(String[] args) 
    { 
     LoginWindow window = new LoginWindow(); 
     window.open(); 
    } 

    public LoginWindow() 
    { 
     display = Display.getDefault(); 
     shell = new Shell(display, SWT.DIALOG_TRIM); 

     db = DatabaseHelper.getInstance(); 
     pref = PreferenceHelper.getInstance(); 

     // Auto login 
     { 
      String login = pref.getLogin(); 
      String password = pref.getPassword(); 

      if (login != null && password != null) 
      { 
       if (db.checkUserDetails(login, password)) 
       { 
        shell.close(); 

        MainWindow window = new MainWindow(); 
        window.open(); 
       } 
       else 
       { 
        pref.setLogin(null); 
        pref.setPassword(null); 
       } 
      } 
     } 
    } 

    public void open() 
    { 
     shell.setSize(450, 230); 
     shell.setText(JavaStrings.DIALOG_TITLE_LOGIN); 
     shell.setLocation(ContentHelper.windowCenter((display.getPrimaryMonitor()).getBounds(), shell.getBounds())); 
     shell.setImages(ContentHelper.loadAppicationIcons(display)); 
     GridLayout gl_shell = new GridLayout(2, true); 
     gl_shell.verticalSpacing = 10; 
     gl_shell.marginWidth = 10; 
     gl_shell.marginHeight = 10; 
     gl_shell.horizontalSpacing = 10; 
     shell.setLayout(gl_shell); 

     Label lblUsername = new Label(shell, SWT.NONE); 
     lblUsername.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); 
     lblUsername.setText(JavaStrings.TEXT_LOGIN); 

     widgetLogin = new Text(shell, SWT.BORDER); 
     widgetLogin.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); 
     widgetLogin.addKeyListener(new KeyAdapter() 
     { 
      public void keyReleased(KeyEvent e) 
      { 
       if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) 
       { 
        widgetPass.forceFocus(); 
       } 
      } 
     }); 

     Label lblPassword = new Label(shell, SWT.NONE); 
     lblPassword.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); 
     lblPassword.setText(JavaStrings.TEXT_PASS); 

     widgetPass = new Text(shell, SWT.BORDER | SWT.PASSWORD); 
     widgetPass.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); 
     widgetPass.addKeyListener(new KeyAdapter() 
     { 
      public void keyReleased(KeyEvent e) 
      { 
       if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) 
       { 
        tryLogin(); 
       } 
      } 
     }); 

     Label lblForgetPassword = new Label(shell, SWT.NONE); 
     lblForgetPassword.setAlignment(SWT.RIGHT); 
     lblForgetPassword.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1)); 
     lblForgetPassword.setText(JavaStrings.TEXT_FORGET_PASS); 
     lblForgetPassword.addMouseListener(new MouseButtonClick()); 

     Button bRegister = new Button(shell, SWT.NONE); 
     bRegister.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); 
     bRegister.setText(JavaStrings.BUTTON_TEXT_REGISTER); 
     bRegister.addSelectionListener(new SelectionListener() 
     { 
      @Override 
      public void widgetSelected(SelectionEvent e) 
      { 
       RegisterWindow window = new RegisterWindow(shell); 
       window.open(); 
      } 

      @Override 
      public void widgetDefaultSelected(SelectionEvent e) 
      { 
       RegisterWindow window = new RegisterWindow(shell); 
       window.open(); 
      } 
     }); 

     Button bLogin = new Button(shell, SWT.NONE); 
     bLogin.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); 
     bLogin.setText(JavaStrings.BUTTON_TEXT_LOGIN); 
     bLogin.addSelectionListener(new ButtonClick()); 

     shell.open(); 
     shell.layout(); 

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

     display.dispose(); 
    } 

    private class ButtonClick implements SelectionListener 
    { 
     public void widgetSelected(SelectionEvent e) 
     { 
      tryLogin(); 
     } 

     public void widgetDefaultSelected(SelectionEvent e) 
     { 
      tryLogin(); 
     } 
    } 

    private class MouseButtonClick extends MouseAdapter 
    { 
     @Override 
     public void mouseUp(MouseEvent e) 
     { 
      ResetPasswordDialog dialog = new ResetPasswordDialog(shell, SWT.DIALOG_TRIM); 
      dialog.open(); 
     } 
    } 

    private void tryLogin() 
    { 
     if (db.Status() == SqlStatus.OPEN) 
     { 
      String login = widgetLogin.getText().trim(); 
      String pass = widgetPass.getText().trim(); 

      if ((login.length() > 0) && (pass.length() > 0)) 
      { 
       widgetLogin.setEnabled(false); 
       widgetPass.setEnabled(false); 

       User user = db.selectUser(login, pass); 

       if (user != null) 
       { 
        pref.setLogin(user.getLogin()); 
        pref.setPassword(user.getPassword()); 

        shell.close(); 

        MainWindow window = new MainWindow(); 
        window.open(); 
       } 
       else 
       { 
        widgetLogin.setEnabled(true); 
        widgetPass.setEnabled(true); 

        // MessageBox 
       } 
      } 
      else 
      { 
       // MessageBox 
      } 
     } 
     else 
     { 
      // MessageBox 
     } 
    } 
} 

主窗口

public class MainWindow 
{ 
    private Display    display; 
    private Shell    shell; 

    public MainWindow() 
    { 
     display = Display.getDefault(); 
     shell = new Shell(); 
    } 

    public void open() 
    { 
     shell.setSize(500,500); 
     shell.setText(JavaConstants.APPLICATION_NAME); 
     shell.setImages(ContentHelper.loadAppicationIcons(display)); 

     GridLayout gl_shell = new GridLayout(1, false); 
     gl_shell.verticalSpacing = 0; 
     gl_shell.marginWidth = 0; 
     gl_shell.marginHeight = 0; 
     gl_shell.horizontalSpacing = 0; 
     shell.setLayout(gl_shell); 

     shell.open(); 
     shell.layout(); 

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

回答

0

的代码片段您提供不提供太多的信息,但它看起来像你不要关闭LoginDialog。如果是这种情况,LoginDialog将“落后”您的MainWindow,因此如果关闭MainWindow,则会再次出现。


如果这不是你的问题的原因,这里是一个另类:我最近的编程非常类似的东西,应用与MainWindow开始。此窗口将创建一个模态为Dialog(您无法访问MainWindow而不先关闭对话框)并提示用户输入凭证。该对话框然后执行登录并且具有指示登录是否成功的字段。从MainWindow开始,您可以在登录失败时简单地检查该字段并关闭应用程序。

+0

@Bez更新了我的代码片段,我认为问题是LoginWindow构造函数,我打开主窗口。 –

+0

@Андрей可以请您发布MainWindow的代码吗? – Baz