Поставщик компонентов Swingx: скрыть компонент в определенных строках - PullRequest
2 голосов
/ 16 февраля 2012

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

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

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

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

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

  1. Можно ли предотвратить отображение JButtonв JX (дереве)? Таблица должна быть такой же ширины, как ячейка?

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

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

1 Ответ

2 голосов
/ 17 февраля 2012

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

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

        }
));

С другой стороны, поставщик не место для подключения в пользовательском контекстеконфигурацияЭто должно быть сделано в 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).

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

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

Редактировать (дляответьте на отредактированную часть вопроса)

  1. нет, с текущей WrappingIconpPanel: она использует Borderlayout, который - как мы все знаем :-) не учитывает максимальный размер.Использование BoxLayout имело бы проблемы, которые я до конца не помню.Тем не менее, это было бы место для настройки, так что максимальное значение кнопки будет соблюдаться

  2. хммм ... не совсем уверен, как вы реализовали изменение курсора.Предполагая, что он находится в вашем ButtonProvider: реализуйте isRolloverEnabled, чтобы возвращать true / false в зависимости от того, виден он или нет Edit-in-Edit не работает.Не знаю почему, может быть, это ошибка в распознавании ролловеров и / или обработке в WrappingProvider

В выходные дни: -)

...