Часто при использовании JTable
или JTree
пользователь определяет свой собственный модуль визуализации ячеек.
Очень часто пользовательский компонент наследуется от DefaultTableCellRenderer
и реализует метод рендеринга getTableCellRendererComponent
. Оказывается, DefaultTableCellRenderer
на самом деле наследуется от JLabel, поэтому возвращает себя (это) при вызове super (в методе рендеринга), и, таким образом, пользовательский рендерер может аналогичным образом возвращать себя (это).
И все это работает хорошо.
Мой вопрос, как это может быть?
Каждый раз, когда этот метод вызывается таблицей, ему задаются разные параметры, и выходная метка изменяется в зависимости от этих параметров. Если это действительно один и тот же экземпляр метки – не следует ли изменить его в соответствии с последним вызовом этого метода? Не будет ли это означать, что все ячейки таблицы заражены и состоят из одного и того же экземпляра метки, который содержит одно и то же значение (значение последнего вызова метода рендерера)?
Я искал в Интернете и копался в коде Swing и не смог найти ни одного действия клонирования или копирующего конструктора, которое фактически дублирует выходную метку. Я не смог найти никаких доказательств того, что (возможно) свинг использует отражение, чтобы каждый раз заново создавать экземпляр рендерера с нуля.
Я прочитал руководство Swing по JTables и там я мог найти следующие строки:
Вы можете ожидать, что каждая ячейка в таблице будет компонентом. Однако из соображений производительности таблицы Swing реализованы иначе. Вместо этого обычно используется средство визуализации одной ячейки для отрисовки всех ячеек, содержащих данные одного типа. Вы можете думать о средстве визуализации как о настраиваемом чернильном штампе, который таблица использует для штамповки правильно отформатированных данных в каждой ячейке. Когда пользователь начинает редактировать данные ячейки, редактор ячейки берет на себя управление ячейкой, управляя поведением редактирования ячейки.
Они намекают, что действительно то, что я говорю, верно, но не объясняют, как это на самом деле делается.
Я не могу понять. Может ли кто-нибудь из вас?