1

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

4

3 回答 3

4

TableColumnExt 有一个属性 hideable 可以有效地禁用隐藏。它仍然显示在弹出窗口中,您可以切换复选框(这是一个错误,刚刚提交- 菜单项应该被禁用;),但至少该列没有隐藏。要解决该错误,您可以实现不添加复选框的自定义列控件(如 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);

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

于 2013-09-16T15:07:23.840 回答
2

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

为给定的 TableColumn 创建并返回一个 ColumnVisibilityAction。如果不允许切换列,则返回值可能为 null,fi

你可以回来null处理你的案子。

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

于 2013-09-16T13:16:27.093 回答
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);
    }
}

如果您需要隐藏“显示水平滚动条”、“打包”和“全部打包”的控件,请添加到代码中:

//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)

于 2013-10-03T06:43:28.863 回答