Какой код мне следует использовать с run () {}? - PullRequest
2 голосов
/ 17 мая 2011

Я закончил программу Swing + SQL на 2000 строк, и я хотел бы добавить в нее окно входа в систему, прежде чем все будет инициализировано.Окно входа в систему представляет собой класс JFrame, созданный из основной программы.

Так что мое основное приложение должно реализовать Runnable.Все, что я хочу с потоком, который я создаю из этого, это ожидание -with wait() - пока не завершится поток входа в систему - и не использует notify() -.

Моя программа состоит из десятков визуальных компонентов, методовmain(), конструктор, инициализатор и т. Д. Какой минимальный объем кода я должен окружать run(){}?

Это пример того, что я хочу сделать.Это не совсем правильно (я полагаю), но вы получите это:

private void initialize() { // Called from main()

    this.setBounds(100, 200, 1024, 576);
    this.setTitle("Main app");
    this.setVisible(false);

    Runnable runnable = new Visual_Login();
    Thread login_thread = new Thread(runnable);

    login_thread.run();     
    main_thread.wait();

    this.setVisible(true);
    this.setContentPane(getJContentPane());

}

(... надеюсь, я хорошо понимаю параллелизм)

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 17 мая 2011

Не уверен, получу ли я то, что вы хотите достичь, но ... если вы хотите запустить initialize в фоновом режиме, вам нужно:

 Runnable doInit = new Runnable() {
     public void run() {
        component.initialize()
     }
 };

Чтобы запустить его, вы можете сделать следующее:

// if you are running a swing UI and you want the dispatcher to handle the thread.
SwingUtilities.invokeLater(doInit);

или

//if you want to start the thread yourself.
Thread t = new Thread(doInit);
t.start()

... на самом деле не может пойти дальше этого, потому что все остальное действительно зависит от вашей логики.

И, в заключение, это не такСтоит использовать поток здесь, если ваш метод initialize не делает что-то, что занимает много времени, замораживая остальную часть приложения.Не похоже, что initialize делает что-то, кроме как установить некоторые свойства SWING.

2 голосов
/ 17 мая 2011

Вам не нужен другой поток здесь.

В конце действия входа в систему, если вход успешный, создайте экземпляр вашего основного класса jframe и удалите имя входа jframe

class MainFrame extend  JFrame{
 ...
}

class LoginFrame extends JFrame{
.
.
.
 public void login(){
   boolean loginSuccess = checkCredentials(username,password);
   if(loginSuccess){
      MainFrame main = new MainFrame();
      .
      .
      this.dispose();

   }else{
    //show some error to user
   }
 }
}
1 голос
/ 17 мая 2011

Вы запускаете поток методом start(), а не методом run().Класс Thread будет вызывать метод run, когда он правильно настроил себя.

В вашем случае это должно быть:

Runnable runnable = new Visual_Login();
Thread login_thread = new Thread(runnable);
login_thread.start();
// run() will be called later.

wait();
// waits for another thread to do notify or notifyAll.
// it should be around here where the runnable thread will "run()"

Кроме этого, если вы все равно планируете заблокировать приложениетогда зачем вам начинать другой поток?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...