Для чего предназначено это переопределение paintComponent? - PullRequest
0 голосов
/ 11 сентября 2018

Отказ от ответственности: в настоящее время я много занимаюсь Java, но в основном это обработка данных, алгоритмические вещи и очень решительно не графика или UX. Моя идея видеоигр высокой интенсивности - 8-битный понг.

Я натолкнулся на этот фрагмент кода в приложении. Я не могу понять, какую проблему должен решить paintComponent.

JPasswordField pass = new JPasswordField(35) {
    @Override
    protected void paintComponent (Graphics g) {
        g.setColor(getBackground());
        Rectangle r = g.getClipBounds();
        g.fillRect (0, 0, r.width, r.height);
        super.paintComponent(g);
    }
};

Это выглядит как будто он пытается заполнить некоторую область текущим цветом фона, но где "границы клипа" должны быть, и почему это не должно было происходить, находится за пределами моей опыт. Поиск остальной части исходного файла для «клипа» ничего не дал.

Код довольно старый - написан во времена Java 1.5 - но приложение все время работает под текущими JRE (Java 8 и 9 на момент написания статьи). Никогда не было никаких визуальных странностей, о которых сообщалось в поле пароля. Поле отображается в другом скучном JPanel.

Автор кода давно покинул компанию. На самом деле, замена автора покинула компанию до моего приезда. Я не верю, что кто-либо, имеющий отношение к этому разделу кода, все еще работает здесь, поэтому никто не спрашивает. (Меня зовут, чтобы сделать много уколов для таких команд.) Я обнаружил, что многие из их старого кода были грубо-культовыми, потому что они скопировали его из какого-то случайного проекта в другом месте в компания, так что это может быть больше того же самого.

В духе «ткни в него палкой и посмотри, что сломается», я выполнил какую-то чрезвычайно простую игру: заменил getBackground() на Color.MAGENTA, чтобы посмотреть, не стало ли что-нибудь в программном обеспечении ярко-розовым, полностью удалив анонимный подкласс чтобы узнать, не стало ли что-нибудь грушевидным и т. д. Похоже, что ни одно из изменений не оказало заметного влияния на Windows.

Конечно, отсутствие доказательств в сравнении с доказательствами отсутствия и все такое, я не могу доказать, что это не нужно на какой-то платформе. Но я хотел бы добавить комментарий о том, что, возможно, пытался сделать старый автор ...

1 Ответ

0 голосов
/ 11 сентября 2018

Похоже, что он пытается заполнить какую-то область текущим цветом фона, но где "границы клипа" должны быть, и почему это не должно было происходить, это за пределами моего опыта.Поиск остальной части исходного файла для «клипа» ничего не дал.

«Клип» фактически определяется контекстом Graphics и в большинстве случаев определяется размером границ компонента.в любом случае, хотя это можно использовать для увеличения скорости рисования в некоторых сценариях, я не вижу здесь большой пользы, если не рассматривать больше контекста

Вы можете взглянуть на Рисование вAWT и Swing для более подробной информации

Код довольно старый - написан во времена Java 1.5

Я пишу на Swing с 1.3и никогда не возникало необходимости делать что-то подобное

Поскольку одним из заданий paintComponent обычно является рисование фона, а в случае текстового компонента, текста, код выглядит так:ничего не делая.

обнаружили, что большая часть их старого кода была грубо-культовой, поскольку они скопировали его из какого-то случайного проекта в другом месте компании, поэтомуможет быть большеТо же самое.

Это, вероятно, хорошая оценка, возможно, она использовалась для попытки отобразить текст заполнителя в какой-то момент и была изменена до того, что вы видите сейчас ... как дикая догадка.

Я думаю, можно с уверенностью сказать, что вы можете удалить его без каких-либо побочных эффектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...