我有MyTable
这是JXTable
的扩展名:
public class MyTable extends JXTable{...}
可以正常工作。现在,我想让DefaultColumnControlPopup菜单在单击弹出菜单中的元素后仍然打开,以便用户可以进行多次单击而不会烦扰ColumnControlButton的单击。
有人知道怎么做吗?
我一直试图基于this tutorial解决,但没有成功。
最佳答案
经过一番阐述,很容易知道一个人怎么做-很明显...
面向他人的整体解决方案:
我在使用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);
}
}
就这样。在此示例中,混合了三件事:
-如何删除水平滚动条,打包和打包的不需要的项目;
-如何从
ColumnControlPopup
禁用某些列控件,但使它们显示为灰色且没有选中标记;-如何在单击
ColumnControlPopup
后保持JCheckBoxMenuItem
打开;解决方案基于我在Internet上发现的一些资源,但是某些信息过时或无法使用(在
JMenu
中有效,但在弹出菜单中无效)。