Вы не должны пытаться рисовать / перекрашивать вещи до того, как рамка станет видимой.
Что вы можете сделать, это удалить содержимое конструктора GamePanel
и поместить его в отдельный метод, например:
public void startThread() {
Thread t = new Thread(this);
t.start();
}
Затем запустить поток после того, как фрейм станет видимым: 116]
frame.setVisible(true);
gamePanel.startThread();
Еще лучше, избавьтесь от нити внутри панели и создайте ее в своей главной:
frame.setVisible(true);
new Thread(gamePanel).start();
Путем Вы уже отправили, является, вероятно, самым чистым. Если Вам не нравится дополнительное свойство, Вы могли бы реализовать IXmlSerializable
, но тогда необходимо сделать все , который в основном побеждает точку. Я счастливо использовал бы подход, который Вы отправили; это (например), эффективно (никакой комплекс, анализирующий и т.д.), культура, независимая, однозначная, и числа типа метки времени, легко и обычно понимается.
Как в стороне, я часто добавляю:
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
Это просто скрывает его в UI и в ссылке dlls, для предотвращения беспорядка.
Более читаемая опция состояла бы в том, чтобы сериализировать как строка и использовать TimeSpan.Parse
метод для десериализации его. Вы могли сделать то же как в Вашем примере, но использовании TimeSpan.ToString()
в методе get и TimeSpan.Parse(value)
в методе set.
Другой вариант - сериализовать его с использованием класса SoapFormatter
, а не класса XmlSerializer
.
Полученный XML-файл выглядит немного иначе ... некоторые теги с префиксом "SOAP" и т. д ... но он может это сделать.
Вот что SoapFormatter
сериализовало период времени в 20 часов и 28 минут, сериализованный в:
<myTimeSpan>P0Y0M0DT20H28M0S</myTimeSpan>
Для использования SOAPFormatter, необходимо добавить ссылку на System.Runtime.Serialization.Formatters.Soap
и использовать пространство имен с тем же именем.