【问题标题】:Swingx DefaultColumnControlPopup with still open menuSwingx DefaultColumnControlPopup 仍然打开菜单
【发布时间】:2013-10-03 10:44:21
【问题描述】:

我有MyTable,它是JXTable的扩展:

public class MyTable extends JXTable{...}

按预期工作正常。现在我想让 DefaultColumnControlPopup 菜单在单击弹出菜单中的元素后仍然打开,这样用户就可以进行多次点击,而不会在 ColumnControlButton 上进行恼人的点击。

有人知道怎么做吗?

我一直在尝试基于this tutorial 解决但没有成功。

【问题讨论】:

  • 你需要一个自定义的 ColumnControl,看看可视化测试(在测试层次结构中,可能是 table packeag),有一个使用带有列表的弹出窗口的示例)。无关:为什么要扩展 xtable?通常情况下,您不应该,所有东西(我们认为,至少 :-) 都是完全可配置的,无需子类化。
  • @kleopatra 类扩展,因为我需要删除水平滚动,打包所有并选择打包(默认添加到每个ColumnControlButton)并控制每个JCheckBoxMenuItemsetEnabled()setSelected() -two来自 11 列的内容必须永久显示。

标签: java swing swingx


【解决方案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);
    }
}

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

解决方案基于我在 Internet 上找到的一些资源,但有些信息过时或无法正常工作(在 JMenu 中有效,但在弹出菜单中没有)。

【讨论】:

  • 很高兴您找到了解决方案,只是有几个更好的解决方案 :-) - tableColumnExt 有一个可隐藏的属性,默认 columnControl 尊重该属性(尽管在初始设置中有错误,请参阅问题跟踪器以解决问题)-不要扩展 JXTable,而是使用您的自定义控件配置它-对于不包括其他操作,实现弹出窗口的 addAdditionalActions 以不执行任何操作(因为您必须扩展出于其他原因的控制)-在单个实例上设置 ui 很脆弱(无法在 LAF 切换后继续存在)并且会破坏视觉效果(对于 LAF 的 != basic/metal)
  • @kleopatra 我同意你的观点,但工作示例应该很好。一直在环顾四周,但没有找到任何东西(这可能意味着我一直在寻找错误)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多