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