2013-10-03 28 views
1

我有MyTable這是JXTable的延伸:Swingx DefaultColumnControlPopup與仍然打開菜單

public class MyTable extends JXTable{...} 

如預期正常工作。現在我想讓DefaultColumnControlPopup菜單在點擊彈出式菜單中的元素後仍然打開,這樣用戶就可以進行多次點擊而不會在ColumnControlButton上產生煩人的點擊。

有人知道該怎麼做嗎?

我一直在試圖根據this tutorial來解決,但沒有成功。

+0

你需要一個自定義的ColumnControl,看看可視化測試(在測試層次結構中,可能是表包),有一個使用彈出式列表的例子)。無關:爲什麼要擴展xtable?通常情況下,你不應該,一切(我們認爲,至少:-)是完全可配置的,不需要子類化。 – kleopatra

+0

@kleopatra類擴展,因爲我需要刪除水平滾動,打包所有和打包選擇(默認添加到每個'ColumnControlButton')並通過'setEnabled()'和'setSelected()'-two控制每個'JCheckBoxMenuItem'從11列必須永久顯示。 – 1ac0

回答

0

一些闡述後,它很容易,如果一個知道如何做到這一點 - 那麼明顯......

他人整體解決:

我有類在我使用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中工作,但在彈出菜單中沒有)。

+0

很高興你找到了一個解決方案,只是有幾個更好的 - nots :-) - tableColumnExt有一個屬性可以被默認的columnControl所尊重(儘管在初始設置中有bug,請參閱問題跟蹤器的解決辦法) - 不要擴展JXTable,而是用你的自定義控件配置它 - 爲了不包括其他動作,實現彈出的addAdditionalActions什麼都不做(因爲你必須爲其他原因擴展控件) - 在單個實例上設置UI是脆弱的(將無法生存的LAF切換)並打破視覺效果(對於LAF!=基本/金屬) – kleopatra

+0

@kleopatra我同意你的觀點,但工作示例應該很好。一直在四處張望,但沒有發現任何(這可能意味着我一直在尋找錯誤)。 – 1ac0