0

ログインプロンプトが追加されたGUIがあります。

while(notValidLogIn){
        LoginPrompt.getDetails() //a static method that 
}

ただし、loginPrompt は、親 JFrame を持つ Jdialog です。クリックされたキャンセルのループを停止するにはどうすればよいですか? System.exit(0) をキャンセル アクションの実行に入れることができます。しかし、すべてを止めたくないので、次のようなものが欲しいです:

while(notValidLogIn && LoginPrompt.isNotCancelled()){
  LoginPrompt.getDetails(); //a static method that creates an instance of login JDialog()
}
4

2 に答える 2

1
while(notValidLogIn && LoginPrompt.isNotCancelled()){
  LoginPrompt.getDetails(); //a static method that creates an instance of login JDialog()
}

このループが EDT (イベント ディスパッチ スレッド) 以外の別のスレッド内にある場合は、SwingUtilities.invokeAndWait(new Runnable())関数を使用できますinvokeAndWait()。EDT が指定されたタスクの実行を完了するまで、現在のスレッドをブロックします。JDialogue/JFileChooserこのオプションは、ユーザーからの確認やetcを使用したその他の入力を取得するためにスレッドの実行を待ちたい場合に特に使用されます。

while(notValidLogIn && LoginPrompt.isNotCancelled()){
    SwingUtilities.invokeAndWait(new Runnable() {
       public void run() {
          LoginPrompt.getDetails() ;
       }
    });

  }

注: を強調するために再度述べます: このループが別のスレッド内で実行されていることを確認する必要があります: の拡張クラスを使用するRunnableか、匿名クラスを使用するなど:

new Thread()
{
   // other code of your context
  public void run()
  {
      while(notValidLogIn && LoginPrompt.isNotCancelled()){
        SwingUtilities.invokeAndWait(new Runnable() {
           public void run() {
              LoginPrompt.getDetails() ;
           }
         });
      }
   }
}.start();
于 2013-11-14T11:14:11.043 に答える
1

私が取り組んでいた最近のプロジェクトでは、イベント ベースのソリューションを実装しました。アイデアは、ログインプロセスがどのように行われたかJDialogを親に通知することでJFrameあり、この最後のプロセスは実行を継続する場合と継続しない場合があります。このようにして、ループがなく、別々の責任を負います。スキーマは次のようになります。

ログインイベント:

これはイベントそのものです。それほど複雑ではありません:

class LoginEvent extends EventObject {

    public static final int LOGIN_SUCCEEDED = 0;
    public static final int LOGIN_FAILED = 1;
    public static final int LOGIN_DIALOG_CLOSED = 2;

    private int id;

    public LoginEvent(Object source, int id) {
        super(source);
        this.id = id;
    }

    public int getId() {
        return id;
    }
}

ログインリスナー

これらを処理するインターフェースLoginEvent:

public interface LoginListener extends EventListener {

    public void handleLoginEvent(LoginEvent evt);

}

ログインダイアログ

このクラスはList、サブスクライブされた を維持する必要がありますLoginListeners:

class LoginDialog {

    List<LoginListener> listeners = new ArrayList<>();

    JDialog dialog;
    JButton accept;
    JButton cancel;

    public void show() {
        //create and show GUI components
    }

    public void close() {
        if(dialog != null) {
            dialog.dispose();
        }
    }

    ...

    public void addLoginListener(LoginListener loginEventListener) {
        if(!listeners.contains(loginEventListener)) {
            listeners.add(loginEventListener);
        }
    }

    public void removeLoginListener(LoginListener loginEventListener) {
        listeners.remove(loginEventListener);
    }

    public void dispatchLoginEvent(LoginEvent evt) {
        for(LoginListener loginListener: listeners) {
            loginListener.handleLoginEvent(evt);
        }
    }
}

acceptおよびcancelボタンへのアクション リスナーの追加:

    accept.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // validate login data
            if(loginValid) {
                dispatchLoginEvent(new LoginEvent(dialog, LoginEvent.LOGIN_SUCCEEDED));
            } else {
                dispatchLoginEvent(new LoginEvent(dialog, LoginEvent.LOGIN_FAILED));
            }
        }
    });

    cancel.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            dispatchLoginEvent(new LoginEvent(dialog, LoginEvent.LOGIN_DIALOG_CLOSED));
        }
    });

LoginListener のサブスクライブ

あなたのJFrame

    final LoginDialog dialog = new LoginDialog();
    dialog.addLoginListener(new LoginListener() {

        @Override
        public void handleLoginEvent(LoginEvent evt) {
            if(evt.getId() == LoginEvent.LOGIN_SUCCEEDED {
                dialog.close();
                //continue execution
                return;
            }
            if(evt.getId() == LoginEvent.LOGIN_FAILED) {
                JOptionPane.showMessageDialog(null, "Login failed!");
                return;
            }
            if(evt.getId() == LoginEvent.CLOSE_LOGIN_DIALOG) {
                dialog.close();
                // do something when this dialog is closed
            }                
        }
    };
    dialog.show();
于 2013-11-14T12:06:07.237 に答える