我正在开发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();
}
}
}
}
答案 0 :(得分:0)
您提供的代码段不提供太多信息,但看起来您没有关闭LoginDialog
。如果是这种情况,LoginDialog
将“落后”您的MainWindow
,如果您关闭MainWindow
,就会再次显示。
如果这不是您遇到问题的原因,可以选择以下方法:我最近编写了一些非常相似的内容,应用程序以MainWindow
开头。然后,此窗口将创建一个模态Dialog
(您无法在不先关闭对话框的情况下访问MainWindow
)并提示用户输入凭据。然后Dialog执行登录并有一个字段,指示登录是否成功。从MainWindow
开始,您只需检查字段并在登录失败时关闭应用程序。