Swingx DefaultColumnControlPopup с открытым меню

У меня есть MyTable, который является расширением JXTable:

public class MyTable extends JXTable{...}

Работает нормально, как и ожидалось. Теперь я хочу, чтобы меню DefaultColumnControlPopup по-прежнему открывалось после нажатия на элемент во всплывающем меню, чтобы пользователь мог выполнять несколько кликов без раздражающих кликов по ColumnControlButton.

Кто-нибудь знает, как это сделать?

Я пытался решить на основе этот учебник, но без успех.


person 1ac0    schedule 03.10.2013    source источник
comment
вам нужен пользовательский ColumnControl, посмотрите на визуальный тест (в иерархии тестов, возможно, таблица packeag), есть пример использования всплывающего окна со списком). Несвязанный: почему вы расширяете xtable? Как правило, вы не должны, все (по крайней мере, о чем мы подумали :-) полностью настраивается без подклассов.   -  person kleopatra    schedule 03.10.2013
comment
Класс @kleopatra расширен, потому что мне нужно удалить горизонтальную прокрутку, упаковать все и упаковать выбранные (по умолчанию добавляется в каждый ColumnControlButton) и контролировать каждый от JCheckBoxMenuItem до setEnabled() и setSelected() - два из одиннадцати столбцов должны отображаться постоянно.   -  person 1ac0    schedule 03.10.2013


Ответы (1)


После некоторой проработки это легко, если знать, как это сделать - очевидно...

Полное решение для других:

У меня есть класс, в котором я использую JXTable:

JXTable myTable = new JXTable(new MyTableModel())
...use_table_as_usually...

класс для таблицы:

public class MyTable extends JXTable{
    public MyTable(AbstractTableModel model){
        super(model);
        //remove items for horizontal scrollbar, pack and packall
        this.getActionMap().remove("column.horizontalScroll");
        this.getActionMap().remove("column.packAll");
        this.getActionMap().remove("column.packSelected");
        //first two columns should be shown permanently
        ColumnControlButton controlButton = new ColumnControlButton(this){
            @Override
            protected ColumnControlPopup createColumnControlPopup(){
                return (new NFColumnControlPopup());
            }

            class NFColumnControlPopup extends DefaultColumnControlPopup{
                @Override
                public void addVisibilityActionItems(List<? extends AbstractActionExt> actions){
                    for(int i = 0; i < actions.size(); i++){
                        AbstractActionExt action = actions.get(i);
                        JCheckBoxMenuItem chk = new JCheckBoxMenuItem(action);
                        chk.setUI(new KeepOpenCheckBox());
                        //disable first two items but they will be still shown greyed
                        if(i == 0 || i == 1){
                            chk.setEnabled(false);
                            chk.setSelected(false);
                        }
                        else{
                            chk.setEnabled(true);
                            chk.setSelected(true);
                        }
                        chk.addItemListener(action);
                        super.addItem(chk);
                    }
                }
            }
        };
        this.setColumnControl(controlButton);
    }
}

и, наконец, пользовательский класс, чтобы ColumnControlPopup оставался открытым:

public class KeepOpenCheckBox extends BasicCheckBoxMenuItemUI{
    public static ComponentUI createUI(JComponent c){
        return new KeepOpenCheckBox();
    }

    protected void doClick(MenuSelectionManager msm){
        menuItem.doClick(0);
    }
}

Это все. В этом примере перепутаны 3 вещи: -как убрать ненужные элементы для горизонтальной полосы прокрутки, запаковать и запаковать; -как отключить некоторые элементы управления колонками из ColumnControlPopup, но оставить их серыми и без галочки; -как оставить ColumnControlPopup открытым после нажатия на JCheckBoxMenuItem;

Решение основано на некоторых ресурсах, которые я нашел в Интернете, но некоторая информация устарела или не работает (работает в JMenu, но не во всплывающем меню).

person 1ac0    schedule 03.10.2013
comment
рад, что вы нашли решение, просто есть пара не лучше :-) - у tableColumnExt есть свойство hideable, которое соблюдается по умолчанию columnControl (хотя в начальной настройке есть ошибки, см. Трекер проблем для обхода) - не расширяйте JXTable, вместо этого настройте его с помощью своего пользовательского элемента управления - чтобы не включать другие действия, внедрите всплывающее окно addAdditionalActions, чтобы ничего не делать (поскольку вам необходимо расширить элемент управления по другим причинам) - установка Пользовательский интерфейс в отдельных экземплярах хрупкий (не переживет переключение LAF) и ломает визуальные эффекты (для LAF != базовый/металлический) - person kleopatra; 04.10.2013
comment
@kleopatra я согласен с вами, но рабочий пример должен быть хорошим. искал вокруг, но ничего не нашел (что может означать, что я искал неправильно). - person 1ac0; 04.10.2013