Java Swing的多窗口应用程序

时间:2014-02-21 16:41:46

标签: java swing

我使用Java Swing完成了一些基本的桌面应用程序。但是,我希望利用自己的技能开发一个涉及用户身份验证的更复杂的应用程序。 我希望有一个包含JTextField的开启窗口来接受用户的用户名和密码。在成功验证(检查数据库中的用户详细信息)后,我想要一个新窗口,其中包含有关用户的一些信息。 如何使用Swing实现这种多窗口效果? 谢谢!

2 个答案:

答案 0 :(得分:2)

  1. 创建一个提示用户详细信息的JDialog
  2. 显示对话框。
  3. 从对话框获取凭据*。
  4. 验证。
  5. 为您的应用创建JFrame
  6. 显示框架。
  7. *不要从对话框中进行身份验证,只需让您的UI保持UI状态。

答案 1 :(得分:2)

引用蓝彼得的话,“这是我之前制作的”。我已将其实现为JPanel,然后将其嵌入JDialog方法的main中。请注意,在首次显示对话框时,有一个钩子可以使密码字段获得焦点。

class LoginPanel extends JPanel {
  private final JTextField userNameTxtFld;
  private final JPasswordField passwordFld;

  public LoginPanel() {
      super(new GridBagLayout()); // GridBagLayout: Not everyone's bag.

      this.userNameTxtFld = new JTextField(12);
      this.passwordFld = new JPasswordField(12);

      userNameTxtFld.setText(System.getProperty("user.name"));

      GridBagConstraints gbc = new GridBagConstraints();
      gbc.anchor = GridBagConstraints.WEST;
      gbc.fill = GridBagConstraints.HORIZONTAL;
      gbc.insets = INSETS;
      gbc.ipadx = 0;
      gbc.ipady = 0;
      gbc.weightx = 0.0;
      gbc.weighty = 0.0;
      gbc.gridx = 0;
      gbc.gridy = 0;

      int row = 0;
      addLabelledComponent("User Name:", userNameTxtFld, this, gbc, 0, row++);
      //noinspection UnusedAssignment
      addLabelledComponent("Password:", passwordFld, this, gbc, 0, row++);
  }

  private boolean gainedFocusBefore;

  void gainedFocus() {
      if (!gainedFocusBefore) {
          gainedFocusBefore = true;
          passwordFld.requestFocusInWindow();
      }
  }

  String getUserName() {
      return userNameTxtFld.getText();
  }

  String getPassword() {
      return new String(passwordFld.getPassword());
  }

  void reset() {
      passwordFld.setText("");
  }

  public static void main(String[] args) {
      final LoginPanel pnl = new LoginPanel();
      JOptionPane op = new JOptionPane(pnl, JOptionPane.PLAIN_MESSAGE,   JOptionPane.OK_CANCEL_OPTION);
      JDialog dlg = op.createDialog("Login");
      dlg.addWindowFocusListener(new WindowFocusListener() {
          @Override
          public void windowGainedFocus(WindowEvent e) {
              pnl.gainedFocus();
          }

          @Override
          public void windowLostFocus(WindowEvent e) {
          }
      });
      dlg.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
      dlg.setVisible(true);
      System.exit(0);
  }
}