1

私はJavaSwingを使用して、初めてのGUIプログラムに取り組んでいます。ユーザー名とパスワードを読み込んで、ローカルデータベースに一致するユーザー名とパスワードの組み合わせがあるかどうかを確認するログインフォームクラスがあります。ある場合は、JFrameオブジェクトからメインクラスにユーザー名を返すことができるようにしたいと思います。これは、ログインボタンをクリックしたときにアクションが発生した後にのみ発生する可能性があります。

その特定の時間の後にこのクラスを返す方法がわかりません。

public class Login extends JFrame {

//declaration of components
private JTextField userText = new JTextField(12);
private JPasswordField passText = new JPasswordField(12);

//declaration of variables
String username;
String password;
//...
class loginAction extends AbstractAction{
    loginAction(){
        super("Login");
        putValue(SHORT_DESCRIPTION, "Click to login");
    }
    public void actionPerformed(ActionEvent e){
        userLogin();
    }
}

public String userLogin(){
    String sql = "SELECT * from Employees " +
                 "WHERE Username = ? AND Password = ?";

    try(PreparedStatement ps = con.prepareStatement(sql)){
        ps.setString(1, userText.getText());
        ps.setString(2, new String(passText.getPassword()));
        ResultSet rs = ps.executeQuery();

        if(rs.next())
            //RETURN USERNAME BACK TO MAIN CLASS...How?
        else
            JOptionPane.showMessageDialog(this, "Incorrect username or password.", "", JOptionPane.ERROR_MESSAGE);
    }
    catch (SQLException e) {
        utils.Print.print(e.getMessage());
        printSuppressed(e);
    }
    finally{
    }
}
//...
Login(Connection connect){
///...
    JButton login = new JButton(new loginAction())
//...
}
4

3 に答える 3

4

これには、JDialogs や JOptionPanes などのモーダル ダイアログが作成されたため、JFrame を使用しないでください。これが彼らの存在理由であり、あなたがそれを使わなければ彼らはとても悲しいでしょう. 真剣に、JOptionPane を呼び出すと何が起こるか、呼び出し元プログラムからのコード フローがどのように停止し、続行する前に JOptionPane が戻るのを待つかを知っています。これがモーダル JDialog の動作です (実際、JOptionPane は JDialog の単なる変形です)。 )、そしてこれはまさにあなたが望む動作です。

JFrame を使用しているかどうかに関係なく、JFrame を拡張するクラスを使用することはほとんどないことに注意してください。代わりに、コードを JPanel の作成に向けて調整し、JDialogs、JFrames、またはそれらを表示するときに必要なコンテナーに詰め込みます。

于 2012-12-05T04:16:45.207 に答える
2
  1. フレームやダイアログなどの最上位のコンテナから拡張することはできるだけ避け、UI コンポーネントを に配置することをお勧めしますJPanel。これにより、柔軟性が向上し、長期的には再利用オプションが提供されます。
  2. JDialogの代わりに を使用するJFrameか、より良い方法として、 を使用するJOptionPaneとボタンが処理されます (ただし、検証チェックを実行する前にダイアログを閉じる必要があります)。
  3. イベント ディスパッチ スレッドで実行時間の長いコードやブロック コードを実行しないでください (データベースへのアクセスなど)。
  4. 内部でユーザー情報を維持し、呼び出し元のオブジェクトが getter を介して情報にアクセスできるようにする
于 2012-12-05T04:24:38.067 に答える
1

これを行う 1 つの方法は、コメント行をアクション内の変数を設定する行に置き換えることです。次に、アクションへの参照を保持する必要があります。

例えば、

loginAction la = new loginAction()
JButton login = new JButton(la)

....

// some other code block with reference to la
if(la.isUsernameValid())  
     la.getUsername()

ただし、@Hovercraft が述べたように、これを行うためのより良い方法があります。

于 2012-12-05T04:21:28.030 に答える