java - Swingx DefaultColumnControlPopup 菜单仍然打开

标签 java swing swingx

我有 MyTable,它是 JXTable 的扩展:

public class MyTable extends JXTable{...}

按预期工作正常。现在我想让 DefaultColumnControlPopup 菜单在单击弹出菜单中的元素后仍然打开,以便用户可以进行多次单击,而无需烦人地单击 ColumnControlButton。

有人知道怎么做吗?

我一直试图根据 this tutorial 来解决但没有成功。

最佳答案

经过一番阐述后,如果知道如何去做,那就很容易了 - 显而易见......

为其他人提供完整的解决方案:

我有一个类正在使用 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);
    }
}

仅此而已。在这个例子中混合了三件事: -如何删除水平滚动条、pack 和 packall 不需要的项目; -如何从ColumnControlPopup禁用某些列控件,但保持它们显示为灰色且不带复选标记; -点击JCheckBoxMenuItem后如何保持ColumnControlPopup打开;

解决方案基于我在互联网上找到的一些资源,但有些信息过时或不起作用(在 JMenu 中有效,但在弹出菜单中无效)。

关于java - Swingx DefaultColumnControlPopup 菜单仍然打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19157129/

相关文章:

java - WebSphere 和 StaleConnectionException

java - 在 Java 9 中使用 VarHandle 的正确方法?

java - 将 JFrame 输出存储到主程序中的字符串中

java - 使用java隐藏文件

java - 为什么 JXTable 丢失输入而 JTable 没有?

java - JTabbedPane 出现问题(错误地压缩内容)

java - JButton 用颜色创建

java - 如何更改 JTable 中包含列的行?

java - 是否有关于 SwingX-WS 1.1 及其开发状态的任何 [un] 官方信息?

java - 在 org/jdesktop/swingx/plaf/ComponentAddon 上出现找不到类错误