gpt4 book ai didi

java - 系统剪贴板操作的右键菜单项

转载 作者:行者123 更新时间:2023-12-04 05:21:53 24 4
gpt4 key购买 nike

我发现在 Mac OS X 中运行 Java 程序时,如果您使用键盘命令而无需额外编码,文本字段对象(例如 JField)支持使用系统剪贴板进行剪切、复制和粘贴操作。例如,我可以创建一个 JField,输入一些文本,选择它,然后使用“Command-C”复制它,然后将它粘贴到另一个应用程序中。这同样适用于粘贴从其他应用程序复制的文本。

我真的很喜欢 Java 自动执行此操作,但我注意到编辑菜单不会与剪切、复制和粘贴菜单项一起自动出现。有没有办法在选择文本时自动添加这些菜单项以访问系统剪贴板?如果不是,那么实现它们的最佳方法是什么,使其表现得像任何其他应用程序一样。在这一点上,我只对复制和粘贴文本感兴趣。

另外,我知道系统剪贴板是特定于平台的。文本字段对象的这种自动系统剪贴板功能是否出现在其他平台上?

编辑:我实际上想知道如何将它添加到菜单栏中,但是对于下一个问题,我本来会有一个很好的答案,我决定选择它作为正确答案并重命名问题.

最佳答案

不幸的是,Swing 不支持弹出上下文菜单。你必须自己滚动。幸运的是,这并不太难。也许最干净的方法是安装您自己的事件队列,如 here 所述。 .那篇文章建议了以下实现:

// @author Santhosh Kumar T - santhosh@in.fiorano.com 
public class MyEventQueue extends EventQueue{
protected void dispatchEvent(AWTEvent event){
super.dispatchEvent(event);

// interested only in mouseevents
if(!(event instanceof MouseEvent))
return;

MouseEvent me = (MouseEvent)event;

// interested only in popuptriggers
if(!me.isPopupTrigger())
return;

// me.getComponent(...) retunrs the heavy weight component on which event occured
Component comp = SwingUtilities.getDeepestComponentAt(me.getComponent(), me.getX(), me.getY());

// interested only in textcomponents
if(!(comp instanceof JTextComponent))
return;

// no popup shown by user code
if(MenuSelectionManager.defaultManager().getSelectedPath().length>0)
return;

// create popup menu and show
JTextComponent tc = (JTextComponent)comp;
JPopupMenu menu = new JPopupMenu();
menu.add(new CutAction(tc));
menu.add(new CopyAction(tc));
menu.add(new PasteAction(tc));
menu.add(new DeleteAction(tc));
menu.addSeparator();
menu.add(new SelectAllAction(tc));

Point pt = SwingUtilities.convertPoint(me.getComponent(), me.getPoint(), tc);
menu.show(tc, pt.x, pt.y);
}
}

然后将其用于:
public static void main(String[] args){ 
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new MyEventQueue());

.....
}

使用这行代码,您可以在应用程序中的每个文本组件上获得一个弹出菜单。

Action 类并不太复杂。例如,这是粘贴操作的实现,它显示了与系统剪贴板的交互:
// @author Santhosh Kumar T - santhosh@in.fiorano.com 
class PasteAction extends AbstractAction{
JTextComponent comp;

public PasteAction(JTextComponent comp){
super("Paste");
this.comp = comp;
}

public void actionPerformed(ActionEvent e){
comp.paste();
}

public boolean isEnabled(){
if (comp.isEditable() && comp.isEnabled()){
Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
return contents.isDataFlavorSupported(DataFlavor.stringFlavor);
}else
return false;
}
}

有关其他操作实现的代码,请参阅文章。

关于java - 系统剪贴板操作的右键菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13591784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com