Поставщик компонентов SwingX: скрыть компонент на определенных рядах

StackOverflow https://stackoverflow.com/questions/9311455

Вопрос

У меня подкласс Swingx ComponentProvider для предоставления Jbuttons, но на некоторых строках моего JXTreetable я не хочу показывать какую -либо кнопку. Окончательный «результат», который я хочу, состоит в том, чтобы иметь пустую ячейку, как то, что я получаю, показывая пустой текст в столбце, для которого я не установил поставщика.

  1. Можно ли скрыть визуализированный компонент на определенных строках (в зависимости от значения, например)? Параметр setVisible(false) на визуализированном компоненте в format() или же configureState() не работает.

  2. Можно ли подкласс ComponentProvider, чтобы предоставить различные типы компонентов? Если да, как это будет работать?

  3. Где я могу найти несколько примеров возможностей, которые предлагает компонент -провален, и четкое объяснение того, какой метод делает что (например, я вряд ли понимаю разницу между configureState() а также format())?

РЕДАКТИРОВАТЬ

  1. Возможно ли предотвратить отображение Jbutton, отображаемое в таблице JX (дерево)?

  2. Если я создаю еще один маркер, могу ли я использовать другой предикат (пролон или что -то в этом роде), чтобы изменить курсор? Курсор переходит на руку (по ссылке), даже если кнопка скрыта.

Большое спасибо!

Это было полезно?

Решение

Интересно :-)

  1. Как правило, не работает, потому что CellRendererPane не уважает видимое свойство компонента - оно всегда его общеивает. Но: может работать в Swingx, если фактический поставщик, который он завершил в оберточный проваровидер, и тогда компонент этой обертки установлен невидимым.

фрагмент, точно так же, как подтверждение концепции

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);
            }

        }
));

С другой стороны, поставщик нет Место для подключения пользовательской контексту-зависимой конфигурации. Это должно быть сделано в маркере, как FI в

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);
            }

        }
));

Теперь маркер может бесстрашно изменить видимый на основе контекста. Небольшой визуальный сбой: wrappanticonpanel всегда оставляет некоторое пространство для значка, даже если нет - не совсем уверен, почему это происходит или будет ли безопасно (в Swingx) удалить этот расстояние (оберточный Provider изначально предназначен для использования в Jxtree, он не устанавливается по умолчанию, потому что все еще есть проблемы с компонентом).

  1. (2 В вопросе) Не поддерживается, ComponentProvider предназначен для возврата того же единого компонента, настроенного с одинаковыми свойствами на каждом вызове

  2. (3 в вопросе) Кашель ... Нет, ничего, кроме источников и примеров (в демонстрациях и тестовых пакетах)

Редактировать (Чтобы ответить на отредактированную часть вопроса)

  1. Нет, с текущим обертыванием wrappingiconppanel: он использует пограничный счет, который - как мы все знаем :-) не уважают максимальный размер. Использование Boxlayout, но у меня были проблемы, которые я не полностью помню. Тем не менее, это было бы местом для настройки, так что максимум кнопки будет уважаться

  2. Хммм ... не совсем уверен, как вы реализовали изменение курсора. Предполагая, что он находится в вашем ButtonProvider: реализуйте IsroLloverEnabled вернуть true/false в зависимости от того, является ли он видимым или нет РЕДАКТИРОВАТЬ ВЕДЬМО не работает. Не знаю, почему, может быть, это ошибка в прокат-районе и/или обработке в упаковке

Сейчас в выходные :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top