Интересно: -)
- обычно не работает, потому что CellRendererPane не учитывает свойство visible компонента - оно всегда помечает его.НО: может работать в SwingX, если фактический провайдер обернут в WrappingProvider, а затем компонент этой обёртки установлен невидимым.
фрагмент, просто как подтверждение концепции
table.getColumn(1).setCellRenderer(new DefaultTableRenderer(
new WrappingProvider(IconValues.NONE, new ButtonProvider(), false) {
@Override
protected void configureState(CellContext context) {
super.configureState(context);
rendererComponent.getComponent().setVisible(context.getRow() != 5);
}
}
));
С другой стороны, поставщик не место для подключения в пользовательском контекстеконфигурацияЭто должно быть сделано в Highlighter, как, например, в
AbstractHighlighter highlighter = new AbstractHighlighter(HighlightPredicate.EVEN) {
@Override
protected Component doHighlight(Component component,
ComponentAdapter adapter) {
((WrappingIconPanel) component).getComponent().setVisible(false);
return component;
}
@Override
protected boolean canHighlight(Component component,
ComponentAdapter adapter) {
return component instanceof WrappingIconPanel;
}
};
table.addHighlighter(highlighter);
, который не работает должным образом (кнопка всегда скрыта), потому что не является одним из свойств, которые гарантированно будут сброшены в провайдере.,Ничто не мешает пользовательским провайдерам расширять эти гарантии, например
table.getColumn(1).setCellRenderer(new DefaultTableRenderer(
// custom wrappingProvider which guarantees the reset of visible
// property of the wrapped component
new WrappingProvider(IconValues.NONE, new ButtonProvider(), false) {
@Override
protected void configureState(CellContext context) {
super.configureState(context);
rendererComponent.getComponent().setVisible(true);
}
}
));
Теперь маркер может безбоязненно изменять видимое в зависимости от контекста.Небольшой визуальный сбой: WrappingIconPanel всегда оставляет некоторое место для значка, даже если его нет - не совсем уверен, почему это происходит, или было бы безопасно (в SwingX) удалить этот интервал (изначально предназначен wrappingProvider для использования вJXTree, он не установлен по умолчанию, потому что все еще есть проблемы с ComponentOrientation).
(2 в вопросе) не поддерживается, componentProvider предназначен для возврата одного и того же компонента, настроенного с одинаковыми свойствами при каждом вызове
(3 в вопросе) кашель ... нет, ничего, кроме источников и примеров (в демонстрационных и тестовых пакетах)
Редактировать (дляответьте на отредактированную часть вопроса)
нет, с текущей WrappingIconpPanel: она использует Borderlayout, который - как мы все знаем :-) не учитывает максимальный размер.Использование BoxLayout имело бы проблемы, которые я до конца не помню.Тем не менее, это было бы место для настройки, так что максимальное значение кнопки будет соблюдаться
хммм ... не совсем уверен, как вы реализовали изменение курсора.Предполагая, что он находится в вашем ButtonProvider: реализуйте isRolloverEnabled, чтобы возвращать true / false в зависимости от того, виден он или нет Edit-in-Edit не работает.Не знаю почему, может быть, это ошибка в распознавании ролловеров и / или обработке в WrappingProvider
В выходные дни: -)