Типичным объявлением переменной является
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)
Другие примеры несоответствий включают
Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.
Предложения:
public void appendText(String text)
, который просто добавляет текст String в JTextArea. SwingWorker<Void, String>
и использовать пару метода публикации / процесса для отправки String с сервера в JTextArea, на Swing E vent D ispatch T hread или EDT. catch (IOException e) {}
. Это эквивалент кодирования вождения мотоцикла с закрытыми глазами. Да, сначала это может показаться забавным, но это почти всегда заканчивается плохо. Редактировать Вы можете указать:
"Если это так, как вы говорите, только подходящий для запуска на EDT, как это можно определить внутри который уже запущен? »
blockquote>Я знаю два способа:
- Используйте SwingWorker для фонового потока и используйте пару метода публикации / процесса для это. Проверьте учебник SwingWorker, как это хорошо описано там, или
- Используйте стандартный фоновый поток и помещайте любые вызовы Swing внутри Runnable, которые вы передаете методу
SwingUtilities.invokeLater(...)
.