Как использовать поток для запуска другого JFrame, пока основной работает - PullRequest
0 голосов
/ 10 мая 2019

У меня есть jframe, который я хочу отобразить во время работы моего основного кадра.Я хочу приостановить мой основной код, пока пользователь не выполнит необходимые действия с другим кадром.Я прочитал много решений, но мне нужно, чтобы это было сделано, чтобы мой код полностью понял и понял.я не хочу использовать jdialog, как я видел в качестве ответа раньше.Моя главная цель - лучше понять многопоточность, чтобы я мог использовать то, что я изучаю, в разных случаях.

С созданным мною кодом при запуске потока загружается только один кадр, и никаких других функций в нем нет.(фрейм прост, у него есть метка, список, из которого пользователь выбирает, и кнопка, по сути, возвращающая выбранное значение списка.) Это похоже на то, что поток отрезан от завершения или что-то в этом роде.

вот мой класс, вызывающий экран:

public class myThread implements Runnable {

    String result = null;

    public void run() {
        MessageScreen ms = new MessageScreen();
        ms.setVisible(true);
    }

    public String getResult() {
        return result;
    }

    public void setResult(String AS) {
        result = AS;
    }

}

в моем основном коде вызывается метод, который возвращает значение String [], с этим методом в какой-то момент у меня естьследующий код, вызывающий новый поток для получения значения, необходимого для возврата в исходном методе main:

    myThread mt = new myThread();
    Thread t = new Thread(mt);
    t.start();
    try {
        t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    myreturn = new String[] {"true", mt.getResult()}; 

без перечисления всего кода для второго кадра, когда пользователь нажимает кнопку, и в концеслушатель привязан к кнопке и нажмите кнопку i, чтобы закрыть кадр и вернуть строку, которая была выбрана из списка:

jf.dispose();
myt.setResult(AdminSelection);

в классе кадра, у меня объявлены следующие переменные экземпляра:

String AdminSelection = null;
myThread myt; 

Надеюсь, этого достаточно, чтобы кто-нибудь помог мне разобраться и понять, что здесь не так.

1 Ответ

0 голосов
/ 10 мая 2019

Функция join () ожидает завершения метода run (), когда вы выполняете t.join (), ваш поток уже завершен или почти завершен. Это потому, что в вашем методе run () нет ничего, что блокировало бы поток, пока пользователь не нажал кнопку подтверждения. И лучше так!

Нет смысла создавать поток здесь, вы должны использовать обратный вызов или, в более общем случае, в Java, слушатель. Вы можете посмотреть эту ссылку: https://guides.codepath.com/android/Creating-Custom-Listeners

Но, особенно если вы хотите приостановить основной код, вы должны использовать JDialog, который предназначен для этого! Не пытайтесь блокировать пользовательский интерфейс самостоятельно, вы можете заблокировать поток пользовательского интерфейса (обработанный Swing / AWT) по ошибке. Создание JDialog лучше, потому что все уже сделано для этого использования в потоке пользовательского интерфейса.

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

...