0

私は Java SWT プログラムに取り組んでおり、ユーザー認証用のログイン フォームが必要です。

私のプログラムのエントリ ポイントは LoginWindow です。ユーザーがログインに成功すると、LoginWindow は 2 番目のウィンドウを開き、それ自体を非表示にします。新しいウィンドウを閉じると、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();
            }
        }
    }
}
4

1 に答える 1

0

あなたが提供したコード スニペットは多くの情報を提供していませんが、LoginDialog. この場合、 はLoginDialogあなたの「後ろに座る」MainWindowため、 を閉じると再び表示されますMainWindow


これが問題の原因ではない場合は、別の方法があります。最近、非常によく似たものをプログラミングしており、アプリケーションはMainWindow. このウィンドウは、Dialogモーダル (最初にダイアログを閉じないとアクセスできないMainWindow) を作成し、ユーザーに資格情報の入力を求めます。ダイアログはログインを実行し、ログインが成功したかどうかを示すフィールドを持ちます。ログインに失敗したMainWindow場合は、フィールドを確認してアプリケーションを閉じるだけです。

于 2013-03-28T21:25:09.163 に答える