Поставщик компонентов Swingx: скрыть компонент в определенных строках
Я подклассифицировал компонент ComponentProvider в Swingx для предоставления JButtons, но в некоторых строках моего JXTreeTable я не хочу показывать какие-либо кнопки. Последний "результат", который я хочу получить, - это иметь пустую ячейку, например, то, что я получаю при отображении пустого текста в столбце, для которого я не установил поставщика.
Можно ли скрыть визуализированный компонент в определенных строках (например, в зависимости от значения)? настройка
setVisible(false)
на визуализированном компоненте вformat()
или жеconfigureState()
не работаетМожно ли создать подкласс ComponentProvider для предоставления нескольких различных типов компонентов? Если да, как это будет работать?
Где я могу найти некоторые примеры возможностей, которые предлагает ComponentProvider, и четкое объяснение того, что делает метод (например, я едва понимаю разницу между
configureState()
а такжеformat()
)?
РЕДАКТИРОВАТЬ
Можно ли предотвратить отображение JButton в JX(дереве)? Таблица должна быть такой же ширины, как ячейка?
Если я создаю другой маркер, могу ли я использовать другой предикат (ROLLOVER или что-то еще) для изменения курсора? Курсор изменится на руку (над ссылкой), даже если кнопка скрыта.
Большое спасибо!
1 ответ
Интересно:-)
- обычно не работает, потому что 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);
}
}
));
С другой стороны, поставщик не является местом для подключения настраиваемой контекстно-зависимой конфигурации. Это должно быть сделано в маркере, как в
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 в зависимости от того, виден он или нет. Редактирование в редактировании не работает. Не знаю почему, может быть, это ошибка в распознавании ролловеров и / или обработке в WrappingProvider
Сейчас выходной:-)