Добавление JTextArea из другого класса [duplicate]

Объявлено, но не определено переменная или функция.

Типичным объявлением переменной является

extern int x;

. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:

int x;

Например, следующее генерирует ошибку:

extern int x;
int main()
{
    x = 0;
}
//int x; // uncomment this line for successful definition

Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:

void foo(); // declaration only
int main()
{
   foo();
}
//void foo() {} //uncomment this line for successful definition

Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:

void foo(int& x);
int main()
{
   int x;
   foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
                          //for void foo(int& x)

Другие примеры несоответствий включают

  • Функция / переменная, объявленная в одном пространстве имен, определенное в другом.
  • Функция / переменная, объявленная как член класса, определяемая как глобальная (или наоборот).
  • Тип возвращаемого значения функции, номер и типы параметров и соглашение о вызове не совсем точно согласуются.

Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.

3
задан Reidacus 20 October 2013 в 02:11
поделиться

1 ответ

Предложения:

  • Дайте GUI-классу общедоступный метод, public void appendText(String text), который просто добавляет текст String в JTextArea.
  • Любой внешний класс, который хочет добавить текст в JTextArea должен иметь только действительную ссылку на класс, который имеет этот метод, а затем ему нужно его вызвать.
  • Следует проявлять осторожность, чтобы вызвать этот метод только в потоке событий Swing , EDT.
  • Поскольку вы будете делать это из длинного кода, вы захотите сделать этот длинный код из потока событий Swing. SwingWorker будет хорошо работать для этого. Google и изучите этот учебник, поскольку он будет весьма полезен.
  • Вы должны рассмотреть конкретное использование SwingWorker<Void, String> и использовать пару метода публикации / процесса для отправки String с сервера в JTextArea, на Swing E vent D ispatch T hread или EDT.
  • Никогда не имеют пустого блока catch как показано в приведенном выше коде, catch (IOException e) {}. Это эквивалент кодирования вождения мотоцикла с закрытыми глазами. Да, сначала это может показаться забавным, но это почти всегда заканчивается плохо.

Редактировать Вы можете указать:

"Если это так, как вы говорите, только подходящий для запуска на EDT, как это можно определить внутри который уже запущен? »

Я знаю два способа:

  1. Используйте SwingWorker для фонового потока и используйте пару метода публикации / процесса для это. Проверьте учебник SwingWorker, как это хорошо описано там, или
  2. Используйте стандартный фоновый поток и помещайте любые вызовы Swing внутри Runnable, которые вы передаете методу SwingUtilities.invokeLater(...).
3
ответ дан Hovercraft Full Of Eels 25 August 2018 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: