一些闡述後,它很容易,如果一個知道如何做到這一點 - 那麼明顯......
他人整體解決:
我有類在我使用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);
}
}
和finaly自定義類保持ColumnControlPopup
打開:
public class KeepOpenCheckBox extends BasicCheckBoxMenuItemUI{
public static ComponentUI createUI(JComponent c){
return new KeepOpenCheckBox();
}
protected void doClick(MenuSelectionManager msm){
menuItem.doClick(0);
}
}
就是這樣。在這個例子中混合了3件事: - 如何去除水平滾動條,包裝和包裝中不需要的項目; - 如何禁用ColumnControlPopup
中的某些列控件,但保持它們顯示爲灰色並且沒有選中標記; - 點擊JCheckBoxMenuItem
後如何保持ColumnControlPopup
;
解決方案基於我在互聯網上發現的一些資源,但一些信息已老化或無法工作(在JMenu
中工作,但在彈出菜單中沒有)。
你需要一個自定義的ColumnControl,看看可視化測試(在測試層次結構中,可能是表包),有一個使用彈出式列表的例子)。無關:爲什麼要擴展xtable?通常情況下,你不應該,一切(我們認爲,至少:-)是完全可配置的,不需要子類化。 – kleopatra
@kleopatra類擴展,因爲我需要刪除水平滾動,打包所有和打包選擇(默認添加到每個'ColumnControlButton')並通過'setEnabled()'和'setSelected()'-two控制每個'JCheckBoxMenuItem'從11列必須永久顯示。 – 1ac0