2011-07-26 50 views
1

我創建一個自定義的TransferHandler我的JTree,因此停用複製(僅支持移動)和粘貼(通過檢查canImport support.isDrop()),但我可以」弄清楚如何禁用Cut操作。Java的禁用切紙動作JTree的/的TransferHandler

它看起來像我不得不作出的exportDone法測定,但到目前爲止沒有運氣。到目前爲止,我的方法看起來像這樣,但拖動和剪切都與移動操作相關聯。

protected void exportDone(JComponent source, Transferable data, int action) { 
    if(action == TransferHandler.MOVE) { 
     try { 
      List<TreePath> list = ((TestTreeList) data.getTransferData(TestTreeList.testTreeListFlavor)).getNodes(); 

      int count = list.size(); 
      for(int i = 0; i < count; i++) { 
       TestTreeNode  node = (TestTreeNode) list.get(i).getLastPathComponent(); 
       DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); 
       model.removeNodeFromParent(node); 
      } 
      tree.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     } catch (UnsupportedFlavorException e) { 
      Log.logException(e); 
     } catch (IOException e) { 
      Log.logException(e); 
     } 
    } 
} 

回答

0

您可以從用戶界面中禁用CUT,COPY,PASTE以及從ActionMap中刪除Actions。

JTree tree = new JTree(); 
... 
tree.getActionMap().put("cut", null); 
tree.getActionMap().put("copy", null); 
tree.getActionMap().put("paste", null); 

阻止某人複製,剪切或粘貼使用此樹作爲源。

+0

感謝您的答覆,但這似乎並沒有爲我工作。我在原始樹和TransferHandler存儲的引用中都做了這個。我也想過將刪除的節點和insert一起移動到importData方法,但是在同一個方法中處理這兩個方法都很困難。這將消除'cut'將刪除exportDone方法中的節點的可能性。 – testelemental

0

JTree的 「WHEN_FOCUSED」 的InputMap,但不是第一個 「代」:InputMaps可以有 「父母」(祖父母,曾祖父母等)的InputMap(S)。

tree.getInputMap(JComponent.WHEN_FOCUSED).getParent().remove(KeyStroke.getKeyStroke(KeyEvent.VK_X, KE.CTRL_DOWN_MASK)) 

NB避免太多頭刮你可能也想知道,有不同類型的InputMap之間的「層級」(或者更準確地說秩序「諮詢」):WHEN_FOCUSED先徵求意見,再WHEN_ANCESTOR,最後是WHEN_IN_FOCUSED_WINDOW。如果你把一個按Ctrl-X在一個JComponent的WHEN_ANCESTOR的InputMap(或許是希望它將覆蓋什麼是已經存在),這將是「黯然失色」,如果有一個按Ctrl-X同Jcomponent中的WHEN_FOCUSED的InputMap。

通過製作一個簡單的方法,可以從給定組件探索所有層次結構,顯示所有鍵綁定(至少在層次結構上升:顯示給定窗口中的所有WHEN_IN_FOCUSED_WINDOW鍵擊有點更多地參與)。

我是Jython的用戶,但是這應該是可以理解的:一個類似(但不可避免地那麼優雅)實用程序可以用Java編寫。

def show_ancestor_comps(comp, method): 
    height = 0 
    while comp: 
     if method: 
      # this method can return True if it wants the ancestor exploration to stop 
      if method(comp, height): 
       return 
     height = height + 1 
     comp = comp.parent 

''' NB this can be combined with the previous one: show_ancestor_comps(comp, show_all_inputmap_gens_key_value_pairs): 
gives you all the InputMaps in the entire Window/Frame, etc. ''' 
def show_all_inputmap_gens_key_value_pairs(component, height): 
    height_indent = ' ' * height 
    if not isinstance(component, javax.swing.JComponent): 
     logger.info('%s# %s not a JComponent... no InputMaps' % (height_indent, type(component),)) 
     return 
    logger.info('%s# InputMap stuff for component of type %s' % (height_indent, type(component),)) 
    map_types = [ 'when focused', 'ancestor of focused', 'in focused window' ] 
    for i in range(3): 
     im = component.getInputMap(i) 
     logger.info('%s# focus type %s' % (height_indent, map_types[ i ],)) 
     generation = 1 
     while im: 
      gen_indent = ' ' * generation 
      logger.info('%s%s# generation %d InputMap %s' % (height_indent, gen_indent, generation, im,)) 
      if im.keys(): 
       for keystroke in im.keys(): 
        logger.info('%s%s# keystroke %s value %s' % (height_indent, gen_indent + ' ', keystroke, im.get(keystroke))) 
      im = im.parent 
      generation += 1 
0
ActionMap actionMap = tree.getActionMap(); 
    actionMap.put("cut", null); 
    actionMap.put("copy", null); 
    actionMap.put("paste", null); 

    actionMap.getParent().put("cut", null); 
    actionMap.getParent().put("copy", null); 
    actionMap.getParent().put("paste", null); 
+1

在堆棧溢出一些解釋詞表示讚賞。 – mkl