Я задавал много вопросов о проекте, над которым я недавно работал. Вот сценарий, в котором я нахожусь, и любая помощь или указание в правильном направлении очень помогут...
Это сетевая программа, построенная с сервером и несколькими клиентами. У каждого клиента есть графический интерфейс, который должен действовать в соответствии с командами, отправленными с сервера. Каждый клиент заключен в класс с именем Player
. Этот Player
имеет графический интерфейс (расширяет JFrame
) и основной метод, а сервер имеет только основной метод (без графического интерфейса). Сначала этот класс создавался в основном потоке вот так:
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new Player().setVisible(true);
}
});
Это работало нормально, пока я не понял, что весь класс Player
теперь выполняется в EDT. Итак, когда я жду команд с сервера, весь графический интерфейс блокируется до тех пор, пока эта команда не будет отправлена и не будут выполнены правильные действия. Как вы можете себе представить, это ужасный дизайн, который оказался настоящей головной болью среды кодирования, когда каждый раз, когда вы хотите что-то проверить, вы должны найти какой-то сумасшедший обходной путь, чтобы графический интерфейс оставался неповрежденным.
Очевидно, я должен проверять команды с сервера в отдельном потоке и запускать компоненты GUI в EDT. В моей второй реализации было два класса — один для GUI и один для Player
. Идея заключалась в том, что в Player
была переменная, содержащая графический интерфейс, чтобы я мог получить доступ к графическому интерфейсу из класса Player
, примерно так:
class Player
{
public GUI gui;
...
// And then start this gui inside of the EDT.
EventQueue.invokeLater(new Runnable()
{
public void run()
{
this.gui = new GUI().setVisible(true);
}
}
Это тоже не работает, потому что this
внутри нового объекта Runnable
относится к объекту Runnable
, а не к Player
.
Как я могу общаться между классом Player
в одном потоке и соответствующим классом GUI в потоке EDT?