从列控件弹出菜单中删除列

时间:2013-09-16 12:13:14

标签: java swing swingx jxtable

是否可以控制列控制弹出菜单中的列是否可用?我知道切换(使用CheckBoxList禁用/启用)并使列灰显。但我不想在弹出菜单中输入列,因为该列是Jtable中的必备列。我正在使用JXTable。有任何提示的人吗?

3 个答案:

答案 0 :(得分:4)

TableColumnExt具有可隐藏的属性,可有效地禁用隐藏。它仍会显示在弹出窗口中,您可以切换复选框(that's a bug, just filed - 应禁用菜单项;),但至少不会隐藏该列。要解决这个问题,你可以实现一个自定义列控件(正如Robin正确建议的那样),它不会添加复选框,如:

JXTable table = new JXTable(new AncientSwingTeam());
// here the hideable property is configured manually, 
// in production code you'll probably have a custom ColumnFactory
// doing it based on some data state 
table.getColumnExt(0).setHideable(false);
ColumnControlButton columnControl = new ColumnControlButton(table) {

    @Override
    protected ColumnVisibilityAction createColumnVisibilityAction(
            TableColumn column) {
        if (column instanceof TableColumnExt
                && !((TableColumnExt) column).isHideable())
            return null;
        return super.createColumnVisibilityAction(column);
    }

};
table.setColumnControl(columnControl);
table.setColumnControlVisible(true);

至于不包括菜单项:在引入可隐藏属性时,我们决定使用keeping the item in the list but disable it,因为用户可能会感到困惑,没有看到控件中的所有列。因此,一旦修复了错误(刚刚完成,从修订版#4315开始提交),我建议再次删除自定义列控件。只是我的2欧分,但是: - )

答案 1 :(得分:2)

ColumnControlButton#createColumnVisibilityAction看起来像您正在寻找的方法。根据文件:

  

为给定的TableColumn创建并返回ColumnVisibilityAction。返回值可能为null,f.i。如果不允许切换列

你可以为你的案件返回null

您应该可以使用JXTable#setColumnControl方法将其插入。

答案 2 :(得分:1)

第一种方式:

myTable().getColumnExt(_column_number_).setHideable(false);

这很顺利,但有一个UI缺点:菜单中的文字是灰色的,厚的是黑色 - 用户体验不佳。

因此,尝试修复它,文本将是灰色的,厚的不会在这里:

public class MyTable extends JXTable
{
    public MyTable(AbstractTableModel model)
    {
        //first two columns won't be hiddeable
        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);
                        //Disabling unwanted items but they will be still shown for smooth user experience
                        if(i == 0 || i == 1)
                        {
                            chk.setEnabled(false);
                            chk.setSelected(false);
                            //chk.setIcon(new ImageIcon(Icons.class.getResource("check.png")));
                        }
                        else
                        {
                            chk.setSelected(true);
                        }
                        chk.addItemListener(action);
                        super.addItem(chk);
                    }
                }
            }
        };
        this.setColumnControl(controlButton);
    }
}

如果您需要隐藏“show horizo​​ntal scrollbar”,“pack”和“pack all”的控件添加到代码中:

//remove items for horizontal scrollbar, pack and packall
this.getActionMap().remove("column.horizontalScroll");
this.getActionMap().remove("column.packAll");
this.getActionMap().remove("column.packSelected");

在致电super(model)

之后