Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Вот более универсальная версия решение .
Макета, Мы можем использовать отражение для достигания защищенного свойство DoubleBuffered , и затем это может быть установлено на верный .
Примечание : Вы должны платить свои налоги разработчика а не двойная буферизация использования, если пользователь будет работать на сессии служб удаленных рабочих столов (например, Удаленный рабочий стол), то Этот вспомогательный метод не включит двойную буферизацию, если человек будет работать в удаленном рабочем столе.
public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
//Taxes: Remote Desktop Connection and painting
//http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
if (System.Windows.Forms.SystemInformation.TerminalServerSession)
return;
System.Reflection.PropertyInfo aProp =
typeof(System.Windows.Forms.Control).GetProperty(
"DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(c, true, null);
}
Проверьте этот поток
Повторение ядра того ответа, можно включить флаг стиля WS_EX_COMPOSITED на окне для получения и формы и всех ее средств управления, с двойной буферизацией. Флаг стиля доступен начиная с XP. Это не делает рисование быстрее, но все окно оттягивается во внеэкранном буфере и блитируется на экран в одном сильном ударе. Создание его выглядеть мгновенными к глазам пользователя без видимых артефактов рисования. Это не совсем безаварийно, некоторые визуальные рендереры стилей могут дать незначительный сбой на нем, особенно TabControl, когда имеет слишком много вкладок. YMMV.
Вставка этот код в Ваш класс формы:
protected override CreateParams CreateParams {
get {
var cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
большая разница между этой техникой и поддержкой двойной буферизации Winform - то, что версия Winform только работает над одним управлением в во время. Вы будете все еще видеть каждую отдельную краску управления саму. Который может быть похожим на фликер-эффект также, особенно если непокрашенный прямоугольник управления контрастирует плохо с образованием окна.
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control)
.GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(ListView1, true, null);
Ian имеет еще некоторую информацию об использовании этого на терминальном сервере.
public void EnableDoubleBuffering()
{
this.SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint,
true);
this.UpdateStyles();
}
Перед попыткой двойной буферизации посмотрите, решают ли SuspendLayout ()/ResumeLayout () проблему.
Один путь состоит в том, чтобы расширить определенное управление, которое Вы хотите к двойному буферу и устанавливаете свойство DoubleBuffered в ctor управления.
, Например:
class Foo : Panel
{
public Foo() { DoubleBuffered = true; }
}
Можно также наследовать средства управления в собственные классы и установить свойство там. Этот метод также хорош, если Вы склонны делать много настроенных, которое является тем же на всех средствах управления.
Я нашел, что просто установка установки DoubleBuffered на форме автоматически устанавливает все свойства, перечисленные здесь.
nobugz получает признание за метод в его ссылке, я просто репостю. Добавьте это переопределение в форму:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
Это сработало лучше всего для меня, в Windows 7 у меня появлялись большие черные блоки, когда я изменял размер тяжелой формы элемента управления. Вместо этого элемент управления подпрыгивает! Но так лучше.