1

我为我的 JTree 创建了一个自定义 TransferHandler,因此禁用了复制(仅支持移动)和粘贴(通过检查 canImport 中的 support.isDrop()),但我不知道如何禁用剪切操作。

看来我必须在 exportDone 方法中做出决定,但到目前为止还没有运气。到目前为止,我的方法看起来像这样,但 Drag 和 Cut 都与 Move 操作相关联。

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);
        }
    }
}
4

3 回答 3

0

您也可以通过从 ActionMap 中删除 Actions 从用户界面禁用 CUT、COPY、PASTE。

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

这会阻止某人使用此树作为源进行复制、剪切或粘贴。

于 2011-07-26T01:32:15.457 回答
0

JTree “WHEN_FOCUSED” InputMap,但不是第一代“InputMap”:InputMaps 可以有“parent”(祖父母、曾祖父母等)InputMap(s)。

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

注意,为了避免让人头疼,您可能还想知道在不同类型的 InputMap 之间存在“层次结构”(或更准确地说是“咨询”的顺序):首先咨询 WHEN_FOCUSED,然后咨询 WHEN_ANCESTOR,最后咨询 WHEN_IN_FOCUSED_WINDOW。如果您将 Ctrl-X 放在 JComponent 的 WHEN_ANCESTOR InputMap 中(也许希望它会覆盖已经存在的内容),如果在同一 JComponent 的 WHEN_FOCUSED InputMap 中有 Ctrl-X,这将“黯然失色”。

通过创建一个简单的方法来探索给定组件的所有层次结构,显示所有键绑定(至少在层次结构中向上:显示给定窗口中的所有 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
于 2015-11-03T19:24:22.630 回答
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 );
于 2017-04-04T07:21:08.267 回答