是否可以控制列控件弹出菜单中是否应提供列?我知道切换(使用 CheckBoxList 禁用/启用)和灰色列。但我不想在弹出菜单中输入列,因为该列是 Jtable 中的必备列。我正在使用 JXTable。任何人有任何提示?
3 回答
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 欧分 :-)
ColumnControlButton#createColumnVisibilityAction
看起来像您正在寻找的方法。根据文档:
为给定的 TableColumn 创建并返回一个 ColumnVisibilityAction。如果不允许切换列,则返回值可能为 null,fi
你可以回来null
处理你的案子。
您应该可以使用该JXTable#setColumnControl
方法将其插入。
第一种方式:
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)