Java SWT中的窗口历史如何清晰?

时间:2013-03-28 16:40:01

标签: java swt

我正在开发Java SWT程序,我需要一个用于用户授权的登录表单。

我的程序的入口点是LoginWindow,当用户成功登录LoginWindow时,会打开第二个Window并自行隐藏。当我关闭新窗口时,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();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您提供的代码段不提供太多信息,但看起来您没有关闭LoginDialog。如果是这种情况,LoginDialog将“落后”您的MainWindow,如果您关闭MainWindow,就会再次显示。


如果这不是您遇到问题的原因,可以选择以下方法:我最近编写了一些非常相似的内容,应用程序以MainWindow开头。然后,此窗口将创建一个模态Dialog(您无法在不先关闭对话框的情况下访问MainWindow)并提示用户输入凭据。然后Dialog执行登录并有一个字段,指示登录是否成功。从MainWindow开始,您只需检查字段并在登录失败时关闭应用程序。